C# .NET Web API返回的双精度值包含大量小数点

C# .NET Web API返回的双精度值包含大量小数点,c#,.net,json,double,rounding,C#,.net,Json,Double,Rounding,我正在使用.NETWebAPI返回具有双重属性的信息。在我返回之前,我将这些双精度整数四舍五入到小数点后两位。当我打印它们时,我得到(f.e):145,92。太好了。但当我返回该double时,我的JSON响应将创建一个double,如下所示: “小时数”:145.9200000000002 你知道是什么造成了这个问题吗 我的取整功能是: public double ApplyRounding(double value, int digits) { decimal dec

我正在使用.NETWebAPI返回具有双重属性的信息。在我返回之前,我将这些双精度整数四舍五入到小数点后两位。当我打印它们时,我得到(f.e):145,92。太好了。但当我返回该double时,我的JSON响应将创建一个double,如下所示:

“小时数”:145.9200000000002

你知道是什么造成了这个问题吗

我的取整功能是:

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
<关于小数,code>double的浮点精度与
float
的浮点精度不同。使用
float
更精确地表示十进制数。@AlexBarac你是说
decimal
而不是
float
?@oleksii不。。。我曾经在一个伪随机生成器程序上工作过,它在
double
上的性能很差,在
float
上的性能很好,因为
double
操作会产生舍入问题,这似乎也是OP遇到的问题。谢谢,这很有帮助。我用十进制而不是double->decimal->double解决了这个问题。现在,我的JSON是用正确的小数位数创建的