回答
浮點數是一種特殊的數據類型,用於存儲變化範圍很大的數字。權衡是精確的 - 這就是你所看到的問題。 Floating point numbers
您可能想要用小數數據類型或金錢來存儲您的值。
浮動數字無法映射到所有數字的原因是因爲小數與分數之間的二進制系統不匹配。
1889.99966796875是在這個浮點域中最接近1890的數字,所以用這個二進制表示可以達到最接近的數字。
其他類型,如十進制和金錢,使用其他更多的內存消耗技術來存儲數字(例如,在一個字符串中可以存儲任何數字,但當然這不是最高性能的方式做數學)
一個簡單的例子:0.3在我自己的二元體系:
0.1b (inary) would be 0.5 d (ecimal) so too much...
0.01b --> 0.25d (1/4 too little)
0.011 --> 0.375 (1/4 + 1/8 too much)
0.0101 --> 0.3125 (1/4 + 1/16 still too much)
...
0.010011 --> 1/4 +1/32 + 1/64 = 0.296875
假設我的系統有6位表示分數,0.296875是最接近這個領域。由於十進制/二進制系統無法達到正確的編號。
有關示例見: Floating point inaccuracy examples
而且你的問題一個很好的精心explenation是在這裏找到: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html
另注:這是真正關心的失配,而不是關於「質量」系統:例如,用十進制表示法,不能將1/3表示爲100%準確,而在其他系統中這是完全可能的。
任何您想要存儲精確數字或進行數學計算的數字都應該存儲爲十進制或數字不是浮點數。這是一種不精確的數據類型,它會導致舍入錯誤和不正確的計算。一般來說,浮動應該避免。
這不是真的,fp是數學的第一位。例如。由於其他類型的性能損失,它通常用於統計中,因此您只需知道整個計算的準確性是否在預期的範圍內。 Fp不僅僅是在那裏使用它。 – Peter 2011-04-12 17:03:03
對不起,除非你的數據太小(或者太小),否則float的四捨五入問題使它不適合數據庫中的數學運算。 – HLGEM 2011-04-12 17:48:45
對不起,fp *在許多數學中正確使用它與大或小無關,但與重要數字無關。簡而言之:如果你需要5個和fp。正在提供10,正確使用的(應用的)操作完全沒有問題:舍入問題發生在有效數字之後,無論是在小數點之前還是之後。但對於離散數學,他們確實不適合。 – Peter 2011-04-12 19:24:47
- 1. 存儲值,然後在Javascript
- 2. 存儲網址,然後一旦存儲,加載不同的網址?
- 3. 存儲爲blob但存儲前後長度不同的數據
- 4. SQL Server中的存儲過程(不同)?
- 5. 將存儲在字符串中的Json值分配給類值然後存儲在SQL中
- 6. 我的sql存儲過程
- 7. JS:Chrome存儲:不保存值
- 8. (my)SQL數據庫 - 存儲不同類型的相同值
- 9. ArrayList不存儲值
- 10. MultiSelectListPreference不存儲值?
- 11. $ _SESSION不存儲值
- 12. 將numpy.ndarray作爲圖像存儲,然後保存像素值
- 13. 相同圖像不存儲更多然後一次在sqlite
- 14. SQL-CLR存儲過程不返回值
- 15. 存儲在SQL
- 16. 存儲在SQL
- 17. SQL Server:存儲過程存儲錯誤
- 18. 提交後變量不存儲值
- 19. RavenDB更新後不存儲文檔值
- 20. 不存儲值的數組
- 21. asp.net cookie不存儲的值
- 22. 不存儲變量的值
- 23. 存儲輸入數據,然後回撥?
- 24. 存儲過程如果/然後聲明
- 25. 難以存儲QImage,然後恢復它
- 26. 插入SQL存儲過程值到另一個存儲過程
- 27. SQL Server存儲過程存儲返回值
- 28. 使用按鈕增加標籤值然後存儲值
- 29. 存儲字段值與本地存儲
- 30. 不同存儲器地址
使用'money'作爲列類型。 – khachik 2011-04-12 13:58:18
當我使用貨幣/貨幣來處理SQL Server和'System.Decimal'中的'Money'類型時,我相信你的值是'Money'。 – Johan 2011-04-12 14:14:26