如何修改double類型的精度為小數點後3位?
01-29
在編寫程序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個點的凸包表面積?
※面試系列之一:關於前端面試演算法的一些建議
※一種簡單的字元轉義演算法