在 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 选项来实现此目标?
或者,您可以使用单独的数学库来完成所有数学运算。例如 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
我不知道这对于您的应用程序是否可行且方便,但至少可以让您以“可读”的表达式编写方程式。
今天是否有一个编译为 JavaScript 的解决方案可以做到这一点
值得一提的是,Google 的 Dart 确实支持运算符覆盖并且具有 可选类型注释:https://www.dartlang.org/
运算符覆盖:https://www.dartlang.org/articles/idiomatic-dart/#operators 可选类型:https://www.dartlang.org/articles/optional-types/