找回密码
 立即注册

QQ登录

只需一步,快速开始

lihuiqian1991

初级会员

16

主题

35

帖子

450

积分

初级会员

积分
450
lihuiqian1991
初级会员   /  发表于:2018-8-16 17:30  /   查看:3281  /  回复:3
本帖最后由 lihuiqian1991 于 2018-8-16 17:34 编辑

在JS中,所有数字均按双精度浮点数进行运算,直接将计算结果由二进制转为十进制,如:
1.00000000000002 - 1.00000000000001 = 9.992007221626409e-15
已在Edge 42.17134.1.0,IE 11.112.17134.0,Chrome 67.0.3396.62上确认。

在Excel中,所有数字均按双精度浮点数进行运算,将计算结果由二进制转为十进制并保留15位有效数字,如:
1.00000000000002 - 1.00000000000001 = 9.99200722162641e-15
已在Excel 2016上确认。
参考文档:https://support.microsoft.com/zh ... te-results-in-excel

在SpreadJS中,计算双精度浮点数时,得到的是正确的结果,如:
1.00000000000002 - 1.00000000000001 = 1e-14

请问:SpreadJS的计算精度是怎样的,参考了哪个标准?

3 个回复

倒序浏览
Brander.Zhai
超级版主   /  发表于:2018-8-16 18:55:21
沙发
不论是Excel还是Javascript, 都是参照IEEE 754标准。正如你Share的文档,基于754标准的双精度浮点运算,都有十进制分数表示二进制分数的精度问题,不是100%精确。

但是Excel的计算引擎内部会对这种精度问题进行位数修正,修正策略不可知。
而SpreadJS也做了同样的事情,基础思路网上有很多,比如在进行浮点运算时,将小数转整数运算后,在转回小数。又或者使用一些Javascript native的精度限制方法来修正精度等等。

当然实际的代码情况比这个复杂,就不一一详细陈述了。

希望有所帮助。
回复 使用道具 举报
lihuiqian1991
初级会员   /  发表于:2018-8-17 10:18:14
板凳
Brander.Zhai 发表于 2018-8-16 18:55
不论是Excel还是Javascript, 都是参照IEEE 754标准。正如你Share的文档,基于754标准的双精度浮点运算,都 ...

我们使用SpreadJS和Excel进行涉及金钱的计算,同一段业务逻辑如果出现两个结果,后果将不可知。

Excel计算的精度问题在我所提供的文档中已经详述,根据文档能够正确制作出存在精度问题的测试用例。如(43.1-43.2)+1,实际double运算结果为0.8999999999999986,Excel中运算结果为0.899999999999999,与文档一致。

所以,希望能给出SpreadJS所遵循的标准,如果没有标准,希望能给出详细的文档描述SpreadJS如何处理精度问题。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-8-17 12:32:27
地板
您好,
目前javaScript在精度计算方面做的很差,需要spreadjs自身做很多的修正,您问的这些属于spreadjs内部的处理机制了,这个是有知识产权的,很抱歉无法提供给您。我们能够提供的是,您出现问题之后,提出来我们会根据问题进行修复。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部