2014-04-02 72 views
3

我正在使用.Net Web API返回双倍的信息。在我返回之前,我将这些双打圈数保留到小数点后两位。当我打印它们时,我得到(f.e):145,92。非常棒。但是,当我返回双,我的JSON响应与这样的双重创建:.NET Web API返回大量小数位后的双精度值

“小时”: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; 
    } 

感谢

+1

这是C#如何解释'double'。对于小数,'double'不具有与'float'相同的浮点精度。使用'float'来更精确地表示你的十进制数。 –

+1

@AlexBarac你的意思是'decimal'而不是'float'吗? – oleksii

+1

@oleksii不......我曾经工作过一个伪随机生成器程序,由于double操作创建的舍入问题,这个程序的执行效率很差,因为double操作和float操作都非常好,这似乎是OP的问题 –

回答

3

是的,它被称为 “双圆” 的问题。你可以通过将你的双精度转换为十进制来实现,然后转换成双精度。

一些相关链接:

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

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

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

+0

谢谢,这有帮助。我设法通过使用小数而不是double-> decimal-> double来回答上面的注释。我的JSON现在使用正确的小数位数创建 –