C++解決資料精度問題,對浮點數儲存指定位小數
------ 更新日期 2018年5月13日 21:41:46
1、背景
對浮點數儲存指定位小數。比如, 1.123456. 要儲存1位小數,,呼叫方法後, 儲存的結果為: 1.1。 再比如,1.98765, 儲存2位小數的結果為: 2.00.
2、 解決方案
A、新增標頭檔案
#include <sstream>
#include <iomanip>
B、新增名稱空間
using namespace std;
C、新增函式
/************************************************************************/ /* 函式名:round /* 函式功能:資料精度計算函式 /* 函式引數:float src:待求精度數 int bits:精度(0表示保留小數點後0位小數,1表示保留1位小數,2:表示保留2位小數) /* 函式返回值:精度求取結果 /* Author: Lee /************************************************************************/ float round(float src, int bits);
函式實現
float CDemo1Dlg::round(float src, int bits)
{
stringstream ss;
ss << fixed << setprecision(bits) << f;
ss >> f;
return f;
}
D、呼叫方式
CString str2 = L"99.054";
float f2 = (float)_wtof(str2);
f2 *= 10;
f2 = this->round(f2, 2);
E 、注意
比如, 1.05, double在計算機中表示為 1.0499999997, float表示為1.0500000003, 但其實際都是與1.05相等的。
round方方式對處理的位數為5的情況有例外,比如: 1.05, 處理的結果 可能為1.0499999997。 這裡寫的是float, 你可以換做其他的型別。自己多測幾次就明白了
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 最近採用的方法,, 可行, 實際中已經用過了
主要是在記憶體中用到的變數, 最近就遇到了, 130.34. 而記憶體中 用double 儲存的結果為 130.399999999, 導致後面使用的過程中出現了問題。不能精確為 130.34。 新採用的方法如下:
// 包含標頭檔案
#include <math.h>
// 功能:四捨五入(double),支援正負數
// dSrc : 待四捨五入之數
// iBit : 保留的小數位數。 0 - 不保留小數、1 - 保留一位小數
// 返回值:返回計算結果
//
double Round(_In_ double dSrc, _In_ int iBit)
{
double retVal = 0.0;
int intTmp = 0;
// 若保留小數位數不正確
if ( 0 > iBit )
{
return 0;
}
// 若 為負數
if (0 > dSrc)
{
// 首先轉為正數
dSrc *= -1;
intTmp = (int)((dSrc + 0.5 / pow(10.0, iBit)) * pow(10.0, iBit));
retVal = (double)intTmp / pow(10.0, iBit);
// 再轉為 負數
retVal *= -1;
}
// 若為非負數
else
{
intTmp = (int)((dSrc + 0.5 / pow(10.0, iBit)) * pow(10.0, iBit));
retVal = (double)intTmp / pow(10.0, iBit);
}
// 返回計算結果
return retVal;
}
//---------- 2018-10-25 14:03 更新--------------- 增加函式模版(圖片)-------------
float 資料型別測試: 需要得到 35.57, 資料來源是:35.569999999