从double
转换为decimal
舍入到n
精度位置的最有效(且严格正确)方法是什么?
我正在使用decimal.Round((decimal)d, n, MidpointRounding.AwayFromZero)
,但我发现我在这里四次进行四舍五入 - 一次投降(decimal)d
,一次投放Round()
。
有没有办法直接围绕double
到decimal
到n
个地方?我想我可以通过琴弦往返它,但这看起来很丑陋和昂贵。
2017/5/15:我在corefx github这里添加了一个问题https://github.com/dotnet/corefx/issues/19706
答案 0 :(得分:0)
如果你的双重恰好有15位有效数字,那么<script>App.data = {!! $data !!}</script>
可以解决问题:
System.Convert.ToDecimal(d)
因此,你可以实现所需的舍入而不进行字符串转换或Console.WriteLine(Convert.ToDecimal(123456789012345500.12D)); // Displays 123456789012346000
Console.WriteLine(Convert.ToDecimal(123456789012346500.12D)); // Displays 123456789012346000
Console.WriteLine(Convert.ToDecimal(10030.12345678905D)); // Displays 10030.123456789
Console.WriteLine(Convert.ToDecimal(10030.12345678915D)); // Displays 10030.1234567892
,首先添加10的合适幂(以创建前导数字并减少结果中的小数位数) )或减去最高有效数字(增加小数位数),然后调用Decimal.Round()
(从而在第15位有效数字处舍入修改后的Double),最后从十进制数字中再次减去或添加前导数字。
我真的认为你的方式更好。
答案 1 :(得分:0)
您想要执行两个步骤:
您无法将这些步骤缩减为一个。即使有一个函数获得double number
和int places
作为参数,它也必须执行这两个步骤。
答案 2 :(得分:0)
我不明白的是,为什么要将double值转换为十进制值时舍入double值,因为decimal的精度比double高很多。四舍五入没有意义。
您可以简单地将双精度转换为十进制:
double doubleValue = 12.23;
decimal decimalValue = (decimal) doubleValue;
或其他人的建议:
decimalValue = Convert.ToDecimal(doubleValue);
如果你真的关心性能(我不太确定是这种情况)你应该重新考虑使用decimal而不是double,因为它既不是非常快,也不是非常高效的内存。 Double对于许多应用程序而言足够精确,您应该考虑是否需要十进制类型提供的额外精度。