我有一個COleCurrency代表單價的物件。我有一個double代表數量的值。我需要將總美元金額計算到最接近的一分錢。
看起來COleCurrency已經內置了乘法運算子,但僅用于與long值相乘。
我可以乘以COleCurrency.m_cur.int64,double但這會將 轉換為double,__int64因此它不準確。
準確地將 a 乘以 a 的最佳方法是COleCurrency什么double?
uj5u.com熱心網友回復:
有限二進制浮點值形成有限十進制值的真子集。雖然任何給定的浮點值都具有精確的、有限的十進制表示,但反之則不然。換句話說,并非每個小數都可以使用有限的二進制浮點值來表示。一個簡單的例子是在轉換為二進制浮點值時0.1產生無限的二進制數字序列。
這里重要的一點是,如果您正在處理小數值,使用二進制浮點值來表示它們通常會引入不準確性(很少有例外,例如0.5)。使用整數值執行精確乘法的唯一方法是使用整數作為被乘數。
由于您選擇使用浮點值,因此您唯一能做的就是限制不準確性。建議的解決方案:
__int64 x = currency.m_cur.int64 * (__int64)dbl;
遭受編譯器警告的相同“可能丟失資料”的問題。由于您現在使用的是顯式強制轉換,這會使編譯器靜音。效果還是一樣:浮點值被截斷。
更好的方法是將 64 位整數值轉換為double第一個值。這會產生整數值的精確浮點表示,前提是它在范圍內(大約 /- 1e15)。然后,您可以乘以另一個浮點值(可能會出現舍入誤差),最后使用例如std::llround:
__int64 x = std::llround(static_cast<double>(currency.m_cur.int64) * dbl);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426392.html
上一篇:ASP.NETCoreWebAPI-VisualStudio中未立即顯示例外
下一篇:`MAP_ANONYMOUS`在VisualStudio2019中未定義,帶有適用于Linux的Windows子系統
