javascript 做计算的时候可以信任吗?

Can javascript be trusted when making calculations?

我正在实施一个发票系统,其中所有内容都通过 javascript 动态添加到 dom 上,我正在使用 javascript 在浏览器本身上进行一些计算。 例如,我正在计算每个发票行的数量和单位价格并生成总和

价格可以是浮点数

但我不确定这是否应该被信任,如果有人对 javascript 有同样的想法,请评论:)

我不知道,但 javascript 在我看来不像 PHP 等其他编程语言那样值得信赖,这是我的看法,但如果你能说服我,请做

谢谢

Javascript 使用几乎所有语言用于浮点计算的相同数据类型。双精度浮点数据类型很常见,因为处理器内置了对它的支持。

浮点数的精度有限,大多数带小数部分的数字都不能精确表示。但是,对于您要使用它的用途,精度足以显示正确的结果。

您应该知道精度有限。显示结果时,您应该确保它的格式(和四舍五入)符合您想要显示的精度。否则,有限的精度可能会显示为 14.9500000000000001 而不是 14.95.

的价格

根据JavaScript's specifications,所有数字都是64位精度(如64位浮点精度)。

this post 开始,您有 3 个解决方案:

  1. 对 JavaScript 使用 Decimal 的一些实现,如 BigDecimal.js
  2. 只需要选择一个固定的位数来保留,像这样(Math.floor(y/x) * x).toFixed(2)
  3. 切换到纯整数,将价格视为美分数。这可能会导致您对整个项目进行重大更改

其他答案解决了 JavaScript 使用浮点数表示金钱的问题。

我想到了使用 JavaScript 计算涉及金融交易的另一个问题。 因为代码是在客户端机器上的浏览器中执行的,所以您只能在您可以信任客户端的范围内信任结果。

因此,您实际上应该仅依靠 JavaScript 来计算客户告诉您时您可以认为理所当然的事情。 例如,如果您正在编写一个电子商务网站,您可以相信告诉您客户想要购买什么以及客户送货地址的代码,但是您需要自己计算商品价格以防止客户告诉你更低的价格。

您正在使用的发票系统完全有可能只在您的组织内部使用。 如果是这种情况,您可以忽略整个答案。 但是,如果您的应用程序将被客户用来访问和操作他们的发票和订单,那么您就必须考虑这一点。

财务计算通常需要特定的固定规则(例如)何时以及如何舍入(朝哪个方向)等
这意味着您通常会保持内部小计精度,直到您进入计算的下一部分(例如根据规则集添加税)。

IEEE-754 浮点数(在 javascript 中使用)将为您提供最大精度 2^53(如果您将其视为整数)。
现在你的 'job' 是假装 javascript 不支持浮点并使用最简单的方法自己替换它:减少你的最大整数范围以获得所需的浮点精度并查看结果范围是否是适合您的需要。如果没有,那么您可能需要一个外部高精度数学库(尽管大多数基本操作很容易实现)。

首先确定所需的内部精度(包括预期舍入行为的溢出数字):例如 3 位数字:
FLOOR((2^53)/(10^3))=FLOOR(9.007.199.254.740.992/1000)=9.007.199.254.740,000
如果这个范围足够,那么你不需要其他库,只需乘以你的输入 10^float_digits 并保持每个计算部分的内部精度,同时根据计算所需的规则四舍五入每个步骤(你仍然需要在使用高精度外部数学库时这样做)。

对于(视觉)输出,再次应用适当的舍入并将剩余值除以 10^(floatDigits-roundingDigit(s)) 并将其传递给 Number.prototype.toFixed()(然后在需要时只填充零)。



至于你关于 javascript 与其他编程语言的可信度的其他问题:甚至可以 boot/run 和 use LINUX on javascript inside浏览器:http://bellard.org/jslinux/
让它沉入片刻...
现在,如果我告诉您这甚至可以在 IE6 中运行,您会怎样……真令人羞愧。甚至服务器也可以 运行 on javascript (node.js)..

希望这对您有所帮助(它不适合发表评论)。