java 小数运算 少0.1_计算器是如何实现0.1的?
我都沒注意計算器用的是定點數,給題主一個贊。
這個問題簡單來說這就是浮點數和定點數的區別。
浮點數
優點:能夠用統一的方法,表示范圍變化非常大的數字,以float標準來說,32個bit就可以表示從10的負100多次方到10的正100多次方這么大范圍。
缺點:浮點誤差問題,無法精確表示某些小數。特性類似科學計數法,只能表示“有限個有效數字”。
不知是優點還是缺點:現代CPU集成了FPU,FPU是專門給浮點運算加速的協處理器。因為有了它,現代CPU計算浮點數是非常快的。
定點數
優點:能精確表示取值范圍內的任意數字。
缺點,占用同樣bit數時表示的范圍很小。
浮點數肯定是主流,但是它使用時有一些注意事項,而且在某些場景下也會被特意換成定點數。
舉例一:初學者都要學習判斷兩個小數是否相等的方法,但是有時候會忘記:
// a和b都是float類型,判斷二者是否相等用
if ( Abs(a-b) < EPSILON )
{
......
}
// 其中EPSILON是一個很小的數,根據不同場景取0.000001或0.0001等
舉例二:除了以上最基本的用法,浮點數在圖像縮放等情景下也存在取整精度問題。之前認識一位大牛想改進UI縮放的效果,將浮點數全部改成了自定義的32位定點數,16位表示整數,16位表示小數。再配合改進過的算法,縮放誤差問題迎刃而解。
舉例三:由于王者農藥的流行,現在“幀同步算法”在實時網絡游戲中也倍受關注。幀同步算法要求輸入一致時輸出嚴格一致,飄忽不定的浮點數在這種場景下不受歡迎。所以也會用到定點數,確保運算時沒有誤差。
具體使用時,如果需要用定點數,既可以使用第三方的定點數程序庫,也可以自己封裝一個適合某個特定軟件的定點數類型。
比如C#提供的Decimal可以提供和計算器一樣的精確表示,python定點數的庫名字也叫decimal
總結
以上是生活随笔為你收集整理的java 小数运算 少0.1_计算器是如何实现0.1的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么大开发商的房子总能卖得好?
- 下一篇: 中央空调出现e0是什么意思