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/

相关文章:

c# - 如何使用post请求将服务器端jquery数据表数据发送到服务器

javascript - 在 JavaScript 中检查数字的小数点是否大于 .5?

c# - 将零数字添加到我的十进制值

rounding - SSIS 数据转换数字强制舍入

php - 从文件解析数据后使用舍入函数

c# - MVC 5 中的身份验证过滤器

c# - 使用 NHaml 在 HtmlHelper 中缺少扩展方法

php - 比较双十进制数

mysql - 数据库级别的 Rails 舍入 float

c# - MVC4 WebAPI 找到多个与请求匹配的操作