如何修改double類型的精度為小數點後3位?

在編寫程序double的精度問題帶來了很大的困擾,比如0.5保存為0.49999999等,我更想得到0.500這樣的結果,所以如何從根本上實現呢??

不要軟體編程,或者調用介面,因為不想增加額外的開銷.


impossible


樓主你想要的東西叫十進位浮點(decimal floating point)。這玩意兒一般碼農用的不多但還是有實際意義的,比如金融領域算賬肯定不能用二進位浮點的。IEEE-754貌似對這個有擴展的,你搜十進位浮點應該有不少資料。


不要軟體編程不要調用介面,看著似乎焊一塊cpu更符合要求的樣子。


你需要定點數,不是浮點數,浮點數顧名思義就是小數點部分,也就是精度不固定的數,樓主要求小數點三位,是十進位定點的。

比較簡單的實現方案就是使用整數,表示原數的1000倍的數字。加減法可以直接使用,乘除法需要把結果除以或乘以1000。

如果用c++,可以寫個struct,包裝一下整型,重載一下運算符即可。


一般情況下,要想精確的保存某些不能出現精度問題的數字的時候,用整數。

比如一般的記賬軟體,要存的最高精度是0.01元,那麼最好就按「分」這個單位存儲,1塊錢,就存成100。具體顯示的時候再去換算,這樣在需求範圍內就不會損失精度。


你企圖不引入額外的計算代價,這是絕對不可能的。因為你要求的東西是硬體不直接支持的,那必然是軟體實現。

你有幾條路走:

1:用定點表示,比如你自己設定,整數1234的意思就是12.34。缺點在於進行除法、或者進行浮點乘法時(比如乘以今年的利率),同樣有誤差。

2:用分數表示。寫一個類,一個成員表示數字,一個成員表示分母,一個成員表示分子。這樣可以無精度損失地進行四則運算,但實現比較複雜。可能有現成的庫可以用。


題主可以去補充計算機的基本知識:什麼是浮點數,以及浮點數在計算機中是如何儲存和表示的


double n = 0.5;

printf("%0.3f", n);


大C#有Decimal type。咳咳


理論上是可以的,自己寫一個ieee754的實現代替double就好了,問題是:我既不想用手,又不想張開嘴,我該怎麼吃到螃蟹呢

補充:這是一個既無誠意又無營養的問題。不給出語言和環境叫人怎麼回答。又不肯自己寫又不願意調用介面,恐怕不是解決問題的態度。

建議@陳碩碩帝不要理睬這種問題了,一來浪費自己的時間,二來也會推送到我們的timeline上。


少年你搞錯了。0.1~0.9里只有0.5才是可以被精確保存的。其他八個才是近似保存


try decimal, or multiple all your values by 1000 and represent them in integers.


浮點數的精度問題並不是十進位位數截取導致的,你如果需要這種高精度浮點數,可以用大整數模擬,例如用整數5000儲存5.000,拿出來的時候再插小數點,運算時一律換成整數運算。


建議是你應該好好學學浮點數。


double代表的數的有效數字不是按照小數點後面算的,而是按照有效數字位的數量來算的,所以一個double代表的浮點可能連個位數或者十位數或者百位數都精確不到。double在數軸上的分布不均勻,越靠近0越密集,所以絕對值越小越精確。

讓軟體給你舍入一下吧。


+0.0001


用整形。

int a = (int)((double_data + 0.00001) *1000);


額外開銷來自哪裡?只要你用double這個數據類型,開銷都是一樣的。先了解一下double


題主嘗試下就會發現,二進位表達十進位小數是不可能的。


推薦閱讀:

兩個矩形的相交面積,怎麼求演算法效率相對較高?
BitDegradeTree詳解[多圖]
如何設計演算法計算三維空間中n個點的凸包表面積?
面試系列之一:關於前端面試演算法的一些建議
一種簡單的字元轉義演算法

TAG:演算法 | 編程 | 計算機 | 計算機原理 | 浮點數 |