【发布时间】:2017-03-03 09:17:25
【问题描述】:
如果 Google 表格中 f5 单元格的值为 1.1000(格式为小数点后 4 位的数字),f6 的值为 = f5 * 1.073,我如何确保得到相同的乘法结果Javascript 中的那些值,例如:
var original_value = 1.1000;
var derivative_value = original_value * 1.073;
具体来说,我的问题是 - Javascript 乘法 (derivative_value) 的结果是否与 Google 公式 (f6) 的结果相同?如果没有,我怎样才能做到这一点?
上下文/我尝试过的内容
就上下文而言,这个问题是我试图解决的一个更大问题的一部分,我为此设置了这个JSFiddle。
JSFiddle 有一个original_value 的输入和一个multiplier 的输入。
它将结果输出到小数点后四位,并在需要的地方添加尾随零(这是结果所需的格式)。
尝试检查我正在编写的 Javascript 代码是否会产生与 Google Sheet 公式相同的结果。
[ JSFiddle 已更新为还将decimal.js 结果记录到控制台以进行比较]
编辑
有人建议使用 decimal.js,但我不确定它会如何应用 - 类似于以下内容?
var original_value = new Decimal(1.1000);
// some different multipliers for testing
var multiplier_a = new Decimal(1.073);
var multiplier_b = new Decimal(1.1);
// some different results for testing
var derivative_value_a = original_value.times(multiplier_a).toString();
var derivative_value_b = original_value.times(multiplier_b).toString();
console.log(derivative_value_a); // 1.1803
console.log(derivative_value_b); // 1.21
这比纯 Javascript original_value * multiplier 更准确吗?更重要的是,对于这个问题,它是否总是模拟 Google Sheet 公式产生的相同结果?
【问题讨论】:
-
Javascript 可能是一种危险的语言,因为它的舍入错误而进行大量计算。如果您想安全起见,可以使用以下数学库:github.com/MikeMcl/decimal.js?
-
据我了解,我仍然需要知道 Google Sheet 的乘法“用途”是什么,以便我可以复制相同的行为。我已经在问题中添加了使用 decimal.js 的尝试。我还更新了原始的 JSFIddle 以将
decimal.js结果记录到控制台以进行比较。 -
@EmilS.Jørgensen 据我所知,JS 和 Google 表格都使用相同的 float64 数字格式 - 你有任何关于 Google 表格的规范,它们使用不同的东西吗??
-
@user1063287 请不要忘记
= f5 * 1.073与= round(f5, 4) * 1.073不同!!! -
@EmilS.Jørgensen :除了灾难性的抵消之外,您还需要对大约 1e11 次运算进行非常大的计算,才能通过累积的浮点噪声影响第 5 位有效数字。因此,尽管您必须注意,但我不会将其描述为“危险”。当然,在所有与合同相关的事项中,都应使用与合同中概述或暗示的条件和程序完全一致的方法。
标签: javascript math google-sheets decimal multiplication