【问题标题】:BigNumber.js calculation shows different value when done same calculation in C# using decimal datatype在 C# 中使用十进制数据类型进行相同计算时,BigNumber.js 计算显示不同的值
【发布时间】:2020-11-10 13:26:29
【问题描述】:

我一直在使用BigNumber.js 库进行高精度算术计算。为了保持更高的精度,我使用了 Bignumber 对象的 toFixed 方法,如下所示:

(new BigNumber(6000 )).minus(9006000).div(9006000).times(4503000 ).plus(4503000 ).toFixed()

以上代码给出的结果为2999.99999999999998275。我尝试使用 decimal 数据类型在 C# 中验证此计算结果,因为小数的精度高于双精度,但结果在粒度级别上有所不同。

decimal rg1 = 6000m;
decimal lastSavedRG1 = 9006000m;
decimal lastsavedrefinedgoalMonthly1 = 4503000m;
decimal cal1 = (lastsavedrefinedgoalMonthly1 + (lastsavedrefinedgoalMonthly1 * ((rg1 - lastSavedRG1) / lastSavedRG1)));

此计算给出的值为3000.0000000000000000000001。知道为什么会有这种差异吗?

【问题讨论】:

  • BigNumber 和 C# 十进制不一样,所以它们有不同的精度也就不足为奇了
  • @Evk 差异是因为最大精度吗?但我唯一的疑问是如何验证这个大数字计算
  • 例如bignumber.js有一个config,有一个选项DECIMAL_PLACES:"涉及除法的运算结果的最大小数位数,即除法、平方根和基数转换操作,和负指数的幂运算。”。默认值为 20,但您可以更改它。同时,C#十进制还有一个规则,文档说明它有28-29位精度(虽然和上面的配置不一样,但是你已经可以注意到区别了),你不能改变它。 C# 十进制不是像 bigjs 那样的任意精度数。
  • 因此进行比较 - 您也需要 C# 中的任意精度数,并尽可能对它们进行相同的配置。我不知道任何具有此类属性的内置 C# 类型(有 BigInteger,但它很好,整数,没有分数),但也许有 trird 方库。或者,如果可能的话,您可以弄清楚 C# 十进制如何准确地表示一个数字并尝试在 bigjs 中做同样的事情。
  • @Evk 是的,当我将 DECIMAL_PLACES 的默认值更改为 28 时,我现在能够看到相似性。它确实将值显示为 3000.0000000000000000000000885。另外,看看你的建议,我可能会在 C# 或替代方法中寻找其他第三方库。因为它确实解决了我的目的。

标签: javascript c# arbitrary-precision bignumber.js


【解决方案1】:

澄清一下我的 cmets - 来自 JS 的 BigNumber 是任意精度数。这意味着它可以存储任意大小的数字。但是,小数部分不能具有任意精度,因为许多数字具有无限小数扩展。像1 / 3sqrt(2) 这样的简单表达式在小数部分有无限位数。为此,bigjs 中有一个配置选项 - DECIMAL_PLACES 定义为:

运算结果的最大小数位数 涉及除法,即除法、平方根和基数转换 运算,以及负指数的幂运算。

另一方面,C# 十进制不是任意精度类型。它具有 28-29 位的固定大小和固定精度(如文档中所述)。这个数字包括点前后的数字。

这意味着,如果您将 DECIMAL_PLACES 设置为 28 并将两个数字相除,结果小于 1 - 该结果应该与 C# 十进制一致。但是,一旦您将该结果乘以更大的数字-他们就会开始不同意。 BigJS 点后仍然会有 28 位,但 C# 十进制总共有 28 位,所以如果结果是,例如,10000.,那么小数部分的精确位数是 28-5=23,它们将开始不同意。

简而言之 - 您需要找到 C# 的第三方库,它提供相同的小数任意精度数(BigInteger 不够,因为它是整数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2010-11-16
    • 1970-01-01
    • 2012-01-14
    • 2010-12-22
    • 2017-10-12
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多