亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 中使用十進制數據類型進行相同計算時,BigNumber.js 計算顯示不同的值

在 C# 中使用十進制數據類型進行相同計算時,BigNumber.js 計算顯示不同的值

有只小跳蛙 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還不夠,因為它是整數)。


查看完整回答
反對 回復 2023-07-20
  • 1 回答
  • 0 關注
  • 211 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號