【问题标题】:.NET Web API returns double with a lot of decimal places.NET Web API 返回带有很多小数位的双精度
【发布时间】:2025-12-29 18:35:17
【问题描述】:

我正在使用 .Net Web API 返回具有双精度的信息。在我返回之前,我将这些双精度数四舍五入到小数点后两位。当我打印它们时,我得到(f.e):145,92。都很棒。但是当我返回那个双精度时,我的 JSON 响应是用这样的双精度创建的:

“小时”:145.92000000000002

任何想法是什么造成了这个问题?

我的舍入函数是:

public double ApplyRounding(double value, int digits)
    {
        decimal decValue = (decimal)value;
        // First round is to fix rounding errors by changing things like 0.99499999999999 to 0.995
        decValue = Math.Round(decValue, digits + 5, MidpointRounding.AwayFromZero);
        decValue = Math.Round(decValue, digits, MidpointRounding.AwayFromZero);
        return (double)decValue;
    }

谢谢

【问题讨论】:

  • 这就是 C# 解释 double 的方式。关于小数,double 的浮点精度与 float 不同。使用float 更精确地表示您的十进制数。
  • @AlexBarac 你的意思是decimal 而不是float
  • @oleksii 不...我曾经在一个伪随机生成器程序上工作,由于double 操作的舍入问题,该程序在double 上表现不佳,而在float 上表现出色创建,这似乎是 OP 遇到的问题

标签: c# .net json double rounding


【解决方案1】:

是的,这就是所谓的“双舍入”问题。您可以通过将双精度转换为十进制,对其进行数学运算,然后再转换回双精度来获得它。

一些相关链接:

这里:http://www.exploringbinary.com/double-rounding-errors-in-floating-point-conversions/

这里:Decimal rounding errors upon division (C#)

这里:http://csharpindepth.com/Articles/General/Decimal.aspx

【讨论】:

  • 谢谢,有帮助。我设法通过您的回答和上面的 cmets 解决了这个问题,方法是使用十进制而不是 double->decimal->double。现在,我的 JSON 使用正确的小数位数创建
最近更新 更多