1. 程式人生 > >C++解決資料精度問題,對浮點數儲存指定位小數

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