2014-04-02 108 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現在使用正確的小數位數創建 –