1. 程式人生 > >判斷兩個雙精度浮點數是否整除!

判斷兩個雙精度浮點數是否整除!

防止 src 溢出 客戶端 market nbsp 道理 有效 無法

  這幾天在開發公司項目中,由於屬於期貨產品,所以在此過程中遇到價格和最小單位價格的除法計算。

眾所周知浮點數在計算機中為近視值。比如價格,客戶端輸入的價格為145.5,但是我的服務端斷點顯示為145.49999999999998。

當然從CTP服務器(期貨那邊的服務器)最小單位價格實為0.5,但是斷點顯示為0.50000000000003。所以利用fomd()函數的方法

變落空了。

這裏提一下

函數名: fmod
功 能: 計算x對y的模, 即x/y的余數
用 法: double fmod(double x, double y);

我的本意利用這個函數驗證值是否為零來判斷是否整除。但是由於精度問題無法實現。

所以,首先我想到了一個方法,就是取浮點的小數點後6位有效數字,後面的四舍五入。

算法是這樣的:

double sswr(double x, int n)
{
double temp = x * pow(10.0,-n);
temp = floor(temp +0.5);
return (temp * pow(10.0,n));
}

這樣算法的原理是浮點數先乘於10的n次方 然後加0.5 然後取整數部分 再除以10的n次方。

按理我的想法這個原理可行,隨後我進行了判斷代碼如下:

if((fabs(fmod(sswr(fabs(orderfield.Order_Field.LimitPrice - it_DepthMarket->second.AskPrice1),-7),sswr(it_InstrumentField->second.PriceTick,-7))) > FLT_EPSILON)

按道理說這個方法可行,但是當我測試的時候 發現卻不是這樣 發現符合條件的LimitPrice卻無法通過條件驗證 ,這個問題我一直很糾結,找不到問題。希望大神可以幫我解惑。

既然這個方法行不通。最後我利用了一個簡單粗暴的方法,就是浮點數轉換成整數,進行處理這樣就簡單多了。代碼如下

unsigned long long Limit_Price = (orderfield.Order_Field.LimitPrice*100000 + 0.9);
unsigned long long Prcie_Tick = (it_InstrumentField->second.PriceTick*100000 + 0.9);
if (0 != Limit_Price % Prcie_Tick)

這樣浮點數轉成整數時 自動取整數部分並且實現了四舍五入,由於浮點數為五位數 六位數(再乘於100000) 為了防止整數類型溢出,所以我用了 long long 類型。這樣就簡單的解決了這個問題。

判斷兩個雙精度浮點數是否整除!