C/C++中的double型別四捨五入
阿新 • • 發佈:2019-02-07
一、前言
最近,專案中需要對金額進行四捨五入運算。本身系統中全部使用長整型(long or long long),資料庫中使用decimal,從而防止double型別的精度缺失情況以及資料庫中小數點後幾位的亂七八糟。(這是最基本的金額欄位處理)
但,當遇到除法時還是會出現浮點數,而後要對浮點數進行四捨五入,而測試發現round()函式不能滿足需求。
二、現象
案例 | 強制型別轉換(int) | 格式輸出sprintf("%0.lf") | 庫函式round() | 自行實現 |
258.500000 | 258 | 258 | 259 | 259 |
258.500001 | 258 | 259 | 259 | 259 |
258.499999 | 258 | 258 | 258 | 259 |
258.300011 | 258 | 258 | 258 | 258 |
258.600011 | 258 | 259 | 259 | 259 |
三、結論
<math.h> 中的 round() 函式時嚴格意義上的四捨五入,但是並未考慮到之前double精度損失的情況,如0.499999,其實應當為1。
附錄(自行實現的程式碼):
util.h
template<typename T> inline T labs( const T & x ){return x<0?-x:x;} template<typename T> inline int sgn( const T & x ){return x<0?-1:(x?1:0);} inline int d_round( const double & x ){return (int)(sgn(x)*(labs(x)+0.50001));}