1. 程式人生 > >C/C++中的double型別四捨五入

C/C++中的double型別四捨五入

一、前言

    最近,專案中需要對金額進行四捨五入運算。本身系統中全部使用長整型(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));}