编译为JavaScript选项,该选项使用十进制库而不是IEEE 754数学

Compile-to-JavaScript option that uses a Decimal library instead of IEEE 754 math?

本文关键字:选项 IEEE 数学 JavaScript 编译 十进制      更新时间:2024-04-30

在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中实现运算符重载
  • 建议:int类型#195

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


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

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

现在有没有一个编译到JavaScript的解决方案可以做到这一点

值得一提的是,谷歌的Dart确实支持运算符重写,并且有可选的类型注释:https://www.dartlang.org/

操作员超控:https://www.dartlang.org/articles/idiomatic-dart/#operators可选类型:https://www.dartlang.org/articles/optional-types/

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

math.config({number: 'bignumber'});
// using a parser to manage variables for you in an internal scope:
var parser = math.parser();
parser.eval('a = 0.1');   // BigNumber, 0.1
parser.eval('b = 0.2');   // BigNumber, 0.2
parser.eval('c = a + b'); // BigNumber, 0.3
// or without a parser: 
var scope = {};
math.eval('a = 0.1', scope);   // BigNumber, 0.1
math.eval('b = 0.2', scope);   // BigNumber, 0.2
math.eval('c = a + b', scope); // BigNumber, 0.3
// scope now contains properties a, b, and c

我不知道这对你的应用程序来说是否可行和方便,但至少可以让你用"可读"的表达式来写方程。