请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

wangqgsunway

中级会员

84

主题

224

帖子

740

积分

中级会员

积分
740
wangqgsunway
中级会员   /  发表于:2018-10-16 16:31  /   查看:3453  /  回复:9
blob40877074.png
我们自定义了  FDA函数
          这个格子的公式是  FDA(AVERAGE(I2:I5),2)                    
  其中  AVERAGE(I2:I5)的值应该是 0.945  单独使用 AVERAGE是没有问题的。

blob479923705.png
发现传给FDA方法的参数   也就是 AVERAGE(I2:I5) 的结果 是有精度问题的 0.9450000000000001   
这个怎么处理。请帮忙解决一下。

9 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-16 16:44:23
沙发
您好,这个问题是由于javascript的浮点数精度误差导致的,

您自定义的函数中需要自己用js的Math来处理一下。

不过这个误差非常小,您可以使用类似这样的代码来去掉尾数:

  1. console.log(Math.floor((0.012-0.003) * 10000) / 10000);
复制代码
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2018-10-16 17:34:34
板凳
我注意到 单用 AVERAGE 函数没有问题 控件单元格 显示值 不是0.9450000000000001    是 0.945  ,你们使用的处理方式什么,

不会是这个吧console.log(Math.floor((0.012-0.003) * 10000) / 10000);
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-16 18:07:47
地板
您好,这个问题处理的方式比较多,各有利弊,我先给您分享一篇github的文章,您参考一下。

https://github.com/camsong/blog/issues/9
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2018-10-16 18:49:46
5#
谢谢大牛,我仔细看一下
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-17 08:56:35
6#
不客气,希望能解决您的问题~
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2018-10-18 15:44:56
7#
我有点点困惑,为什么 AVERAGE 方法返回值 返回的时候 不做处理呢 ,直接返回一个 处理精度问题后的结果, 现在应该是在 表格中显示的时候处理了是吧。现在这样是不是增加了出错的概率。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-10-19 15:00:16
8#
是这样的,计算精度问题是js本身造成的,我们在公式计算上有自己的计算引擎,而修改本身的计算方法会造成不可预估的错误。所以这种精度计算的问题我们只能case by case的去修,这样只能从显示上去进行修正。
回复 使用道具 举报
wangqgsunway
中级会员   /  发表于:2018-10-19 15:09:40
9#
ok。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-10-19 16:38:32
10#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部