C#正确高效的 double 到十进制的转换

标签 c# decimal rounding primitive

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/

相关文章:

MySQL数据类型计算字段

Python正则表达式提取浮点值

swift - 使用 round() 在 Swift 中舍入

c# - 如何在 C# 中将参数传递给 Windows 服务?

c# - TlbImp.exe 无法注册 lib 文件 : ".dll is not a valid type library"

c# - Entity Framework 查询最大

c++ - 正确格式化有错误的数字 (C++)

c# - 精确匹配单词,如果前面有特殊符号则不匹配

javascript - 热衷于在 JavaScript 或 jQuery 中获取用户的货币区域设置?

java - 如何在 JSpinner 中禁用值的舍入