有只小跳蛙
2023-07-20 14:44:25
我一直在使用BigNumber.js庫進行高精度算術計算。為了保持更高的精度,我使用toFixedBignumber 對象的方法,如下所示:(new BigNumber(6000 )).minus(9006000).div(9006000).times(4503000 ).plus(4503000 ).toFixed()上面的代碼給出的結果為2999.99999999999998275。我嘗試使用數據類型在 C# 中驗證此計算結果decimal,因為十進制的精度比雙精度高,但結果在粒度級別上有所不同。decimal rg1 = 6000m;decimal lastSavedRG1 = 9006000m;decimal lastsavedrefinedgoalMonthly1 = 4503000m;decimal cal1 = (lastsavedrefinedgoalMonthly1 + (lastsavedrefinedgoalMonthly1 * ((rg1 - lastSavedRG1) / lastSavedRG1)));該計算給出的值為3000.0000000000000000000001。知道為什么會有這樣的差異嗎?
1 回答

狐的傳說
TA貢獻1804條經驗 獲得超3個贊
為了澄清一下我的評論 -BigNumber
來自 JS 的是任意精度數。這意味著它可以存儲任意大小的數字。然而,小數部分不能具有任意精度,因為許多數字具有無限的小數擴展。1 / 3
像or這樣的簡單表達式的sqrt(2)
小數部分有無限多個數字。為此,bigjs 中有一個配置選項 -DECIMAL_PLACES
定義為:
涉及除法的運算結果的最大小數位數,即除法、平方根和基數轉換運算以及帶負指數的冪運算。
另一方面,C# 小數不是任意精度類型。它具有固定大小和 28-29 位數字的固定精度(如文檔中所述)。該數字包括點之前和之后的數字。
這意味著,如果您設置DECIMAL_PLACES
為 28 并將兩個數字相除,結果小于 1 - 該結果應與 C# 十進制一致。然而,一旦你將該結果乘以某個更大的數字 - 他們就會開始不同意。BigJS 的點后仍然有 28 位,但是 C# 小數總共有 28 位,所以如果結果是,比如 10000.,那么小數部分的精確位數是 28-5=23,他們會開始不同意。
簡而言之 - 您需要找到 C# 的第三方庫,它提供相同的小數任意精度數(這BigInteger
還不夠,因為它是整數)。
添加回答
舉報
0/150
提交
取消