使用 Decimal 库而不是 IEEE 754 数学的编译为 JavaScript 选项?

问题描述 投票:0回答:2

在 JavaScript 中

0.1 + 0.2 = 0.30000000000000004
浮点数学是否被破坏?解释了原因,因为 IEEE 754 数学。我正在处理财务/会计领域的应用程序,并且想要一种方法来制作
0.1 + 0.2 = 0.3

因此,我正在寻找一种解决方案,可以采用类似于以下示例的代码,并带有 Decimal 的类型注释(使用 TypeScript 语法)。

var a:Decimal, b:Decimal, c:Decimal;

a = 0.1;
b = 0.2;

c = a + b;

编译/宏扩展过程可以输出使用 JavaScript Decimal 库的代码(例如 decimal.js),因此 c =

0.3
而不是
0.30000000000000004

var a, b, c;

a = new Decimal(0.1);
b = new Decimal(0.2);

c = a.plus(b);

Mozilla sweet.js 宏似乎支持 自定义运算符,“让您定义自己的运算符或覆盖内置运算符。”

问题: sweet.js 可以实现这种行为吗?有没有类似的例子?


TypeScript 转换源代码,这个概念之前已经有人用 TypeScript 询问过:

问题: TypeScript 编译器可以扩展以支持此用例吗?这适合功能请求吗?


此外,关于将 ActionScript 交叉编译为 JavaScript 的系列中的一篇博客文章得出结论,出于一致性原因,他们希望“ActionScript 和 JavaScript 中出现相同的错误结果”,但这并没有假设额外的类型注释。

问题:是否有其他策略或编译为 JavaScript 选项来实现此目标?

javascript typescript decimal ieee-754
2个回答
2
投票

或者,您可以使用单独的数学库来完成所有数学运算。例如 math.js 带有表达式解析器并支持大数(由 decimal.js 提供支持):

math.config({number: 'BigNumber'});

// using a parser to manage variables for you in an internal scope:
var parser = math.parser();
parser.evaluate('a = 0.1');   // BigNumber, 0.1
parser.evaluate('b = 0.2');   // BigNumber, 0.2
parser.evaluate('c = a + b'); // BigNumber, 0.3

// or without a parser: 
var scope = {};
math.evaluate('a = 0.1', scope);   // BigNumber, 0.1
math.evaluate('b = 0.2', scope);   // BigNumber, 0.2
math.evaluate('c = a + b', scope); // BigNumber, 0.3
// scope now contains properties a, b, and c

我不知道这对于您的应用程序是否可行且方便,但至少可以让您以“可读”的表达式编写方程式。


1
投票

今天是否有一个编译为 JavaScript 的解决方案可以做到这一点

值得一提的是,Google 的 Dart 确实支持运算符覆盖并且具有 可选类型注释:https://www.dartlang.org/

运算符覆盖:https://www.dartlang.org/articles/idiomatic-dart/#operators 可选类型:https://www.dartlang.org/articles/optional-types/

© www.soinside.com 2019 - 2024. All rights reserved.