Long to decimal with decimal point at a specific position
在C中,我有一个需要转换为十进制的长。问题是我想把小数点放在一个特定的位置。
例如,假设我有以下长的数字:
当转换为小数时,浮点位于第三个位置,我希望具有以下内容:
为了给你一个例子,函数最好是像Java中的BigCuffimal.ValueOf一样,允许你给一个长的和一个放置小数点的位置,它返回正确的值。
我知道解决方法之一是将长度格式化为具有正确小数点位置的字符串,然后将其转换回十进制。另一种解决方案是将长小数乘以所需的10个小数位,但我想知道是否有更好的选择。
- 您是要转换成十进制还是双精度?他们不是一回事。
- 抱歉,标题有误。我把它修好了。我正试图从长转换为十进制。
- 强相关:int到decimal转换-在指定位置插入小数点
为什么不除以1000(或10^n,其中n是小数位数)?
- 这就是我问题的目的。我想知道是否有一个类似于bigdecimal.valueof的c函数可以让你不用做这些计算就可以转换它。
- 但算术是计算机最擅长的…
- @Cydrickt只需要编写一次(即在扩展方法中),然后在需要的地方调用它。
- 显然,即使获取这些部分需要做更多的工作,十进制构造函数也可以完成这类工作:msdn.microsoft.com/en-us/library/bb1c1a6x%28v=vs.110%29.aspx
1 2 3 4 5
| long l = 123456789L;
int decplaces = 3;
decimal divisor =(decimal) Math.Pow(10, decplaces);
decimal d = l/divisor; |
- 如果decplaces与25类似,可能不准确。或者是转换成decimal的奇怪规则实际上拯救了你?
- 当int decplace=25;d=0.000000000000000123456789(linqpad非常方便)
- 它仍然适用于decplaces=28,但在29,它抛出了一个例外,说它太小了,不适合十进制。
- 我正在考虑这样一个事实:Math.Pow(10, 25)返回一个double,其内部值不能精确为1E+25。它将改为1.0000000000000000905969664E+25。那么人们可能会担心相应的小数会变成10000000000000000905969664m。但实际上它通过某种魔法变成了江户十一〔八〕。所以我认为你的方法毕竟是准确的。
您可以使用具有不同组成部分的Decimal构造函数。您需要做一些位移动,以使指数进入所有相关的部分,但这不应该太难。如果你知道你的值的大小不会超过62位,那也会使事情变得简单。
您只需编写一个循环,用0.1m乘以正确的次数,即循环的numberOfDecimalPlacesWanted次迭代。