c# - .NET Math.Round(<double>,<int>,MidpointRounding.AwayFromZero) 无法正常工作

标签 c#

我使用的是 Visual Studio Professional 2012。 我创建了一个新的 C# ConsoleApplication,目标是 .NET Framework 4.5,代码如下:

    static void Main(string[] args)
    {
        double x = 2.44445;
        double y = Math.Round(x, 4, MidpointRounding.AwayFromZero);
        Console.WriteLine(y);
        Console.ReadKey();
    }

预期结果应为 2.4445,但实际返回 2.4444。 //和之前的框架版本一样的结果,我试了VCE2010。

我知道这种问题通常是由 double 据类型的存储方式引起的(即将有限小数转换为无限二进制小数)。但是我没想到只有5个十进制数字会发生这种情况,例如2.44445

我担心这种事情是否会发生在更短的小数位上。我还想学习一种更安全的 C# 舍入方法(使用远离零约定)。 谢谢。

最佳答案

这确实是由于 float 的精度脆弱。 0.5 可以完美地存储在 IEEE float 中,但 0.45、0.445 等不能。例如,当您指定 2.44445 时存储的实际值是 11009049289107177/4503599627370496,即 2.44449999999999989519494647... 现在应该很明显为什么数字会按原样四舍五入。

如果您需要精确地存储小数,请考虑使用 decimal 类型。

关于c# - .NET Math.Round(<double>,<int>,MidpointRounding.AwayFromZero) 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14055611/

相关文章:

c# - 使用不同域时的远程处理问题

c# - HttpWebRequest: The request was aborted: 请求被取消

c# - 将行值添加到具有 AutoIncreamented DataColumn 的 DataTable

c# - 在 WPF 的 ControlTemplate 中将焦点设置在控件上

c# - 字符串字母验证

c# - 无法找到支持类型为 'Type' 的属性与字符串之间的转换的转换器

c# - FFMPEG - windows - MJPEG 流 - 转换为 MP4 并重新流式传输 - C# - 新手

c# - LINQ to Entities 无法识别 MVC 4 中的方法 'System.String ToString()' 方法

c# - 绑定(bind) x :Load, 更新绑定(bind)值不加载控件 (UWP)

c# - 如何计算和更改 TreeView 宽度