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

QQ登录

只需一步,快速开始

jyjc 讲师达人认证
高级会员   /  发表于:2021-7-13 18:02  /   查看:1717  /  回复:8
本帖最后由 jyjc 于 2021-7-14 15:13 编辑

在内存计算中,单元格S10的公式和结算结果如下图所示:
image.png983775939.png

实际计算结果应为:
image.png542191466.png

公式:=IF(Q10=0,"",IF(R10=1,(N10-(O10-1)*P10),P10))

8 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-14 11:29:32
推荐
本帖最后由 Richard.Ma 于 2021-7-14 12:01 编辑

不客气,已经和研发确认
问题原因
实际上Excel和GC都存在浮点误差。你可以尝试用Offiice Excel新建一个文件进行计算后保存为excel文件后就可以看到误差,只是在界面上做了四舍五入,看起来是正常的

目前解决办法:
GcExcel也可以对Value做四舍五入,设置workbook.AutoRoundValue = true;即可


注:
workbook.AutoRoundValue = true影响的只是把值从GCExcel取出来的那一刻,我们内部计算还是保留浮点误差的,因为四舍五入只会让最终的结果误差更大,所以我们内部不做四舍五入
Excel的内部也是同样的原理,也不做四舍五入,只是在界面上最终显示时进行四舍五入(和gc中设置workbook.AutoRoundValue = true效果相同)

















image.png928668517.png
回复 使用道具 举报
Derrick.Jiao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2021-7-14 15:21:49
9#
jyjc 发表于 2021-7-14 15:13
收到,已验证ok,感谢

解决了就好,有新问题欢迎开新帖交流~
回复 使用道具 举报
jyjc讲师达人认证
高级会员   /  发表于:2021-7-14 15:13:26
8#
Richard.Ma 发表于 2021-7-14 11:29
不客气,已经和研发确认
问题原因
实际上Excel和GC都存在浮点误差。你可以尝试用Offiice Excel新建一个文 ...

收到,已验证ok,感谢
回复 使用道具 举报
jyjc讲师达人认证
高级会员   /  发表于:2021-7-14 10:05:35
6#
Richard.Ma 发表于 2021-7-14 09:36
问题已经重现,目前看来这个是由于.NET 的double本身的精度错误导致的,你可以测试一下c#本身计算0.4528 -7 ...

好的,麻烦了
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-14 09:36:45
5#
本帖最后由 Richard.Ma 于 2021-7-14 09:53 编辑

问题已经重现,目前看来这个是由于.NET 的double本身的精度错误导致的,你可以测试一下c#本身计算0.4528 -7 * 0.0566也会得到这个结果,在GC中数字是作为double类型来计算的,
问题我这边需要和研发再沟通一下,看看有没有什么合适的解决方案,然后给您回复




回复 使用道具 举报
jyjc讲师达人认证
高级会员   /  发表于:2021-7-14 09:21:40
地板
Richard.Ma 发表于 2021-7-13 18:11
问题已经收到,看起来是精度问题,你这个公式计算结果就是P10,正常应该就是0.0566

能否上传一个可以重 ...

测试代码已经贴了,能尽快定位一下吗,这个问题还比较紧急
回复 使用道具 举报
jyjc讲师达人认证
高级会员   /  发表于:2021-7-13 18:56:52
板凳
Richard.Ma 发表于 2021-7-13 18:11
问题已经收到,看起来是精度问题,你这个公式计算结果就是P10,正常应该就是0.0566

能否上传一个可以重 ...
  1. var workbook = new GrapeCity.Documents.Excel.Workbook();

  2.             IWorksheet worksheet = workbook.Worksheets[0];
  3.             worksheet.Range["N10"].Value = 0.4528;
  4.             worksheet.Range["O10"].Value = 8;
  5.             worksheet.Range["P10"].Value = 0.0566;
  6.             worksheet.Range["Q10"].Value = 1;
  7.             worksheet.Range["R10"].Value = 1;
  8.             worksheet.Range["S10"].Formula = "=IF(Q10=0,"",IF(R10=1,(N10-(O10-1)*P10),P10))";

  9.             Console.WriteLine(worksheet.Range["S10"].Value);
复制代码


上面是测试代码
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-7-13 18:11:20
沙发
问题已经收到,看起来是精度问题,你这个公式计算结果就是P10,正常应该就是0.0566

能否上传一个可以重现问题的json文件,我来验证原因
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部