从double
转换为decimal
四舍五入到n
位精度的最有效(并且严格正确)的方法是什么?
我正在使用 decimal.Round((decimal)d, n, MidpointRounding.AwayFromZero)
但我突然想到我在这里四舍五入两次 - 一次是在转换期间 (decimal) d
并通过 Round()
一次。
有没有办法直接将 double
四舍五入到小数
到n
位?我想我可以通过字符串往返它,但这看起来丑陋而且昂贵。
2017 年 5 月 12 日:我在 corefx github 上添加了一个问题 https://github.com/dotnet/corefx/issues/19706
最佳答案
如果您的 double 恰好有 15 位有效数字,则 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
因此,您可以实现所需的舍入,无需字符串转换或 Decimal.Round()
,方法是首先添加合适的 10 次幂(以创建前导数字并减少结果中的小数位数)或减去最高有效数字(以增加小数位数),然后调用 Convert.ToDecimal(d)
(从而将修改后的 Double 舍入到第 15 位有效数字) ,最后再次从十进制数中减去或加上前导数字。
我真的认为你的方法更好。
关于C#正确高效的 double 到十进制的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43138429/