找回密码
 立即注册

QQ登录

只需一步,快速开始

yue1859921
初级会员   /  发表于:2024-3-29 16:13  /   查看:5021  /  回复:15
1金币
本帖最后由 Richard.Huang 于 2024-4-7 09:38 编辑

产品:SpreadJS、GcExcel
版本:SpreadJSV17.0.5、GcExcelV6.2.2
调研编号:SJS-23641

SpreadJS表格中显示的数据是0.6,用Gcexcel转换成PDF后 变成0.5
SpreadJS表格的数据是通过sheet引用及函数计算的出来的值
download.png


GcExcel转换成PDF后,显示的却是0.5
convpdf.png

ssjon见附件

test0329.zip

5.76 KB, 下载次数: 1234

15 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2024-4-15 17:37:47
16#
本帖最后由 Joestar.Xu 于 2024-4-16 11:17 编辑

没有看到您再回复,这个帖子先结帖了。
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-7 14:05:07
15#
yue1859921 发表于 2024-4-4 11:03
嗯明白了,那就能保证spreadjs和GcExcel转pdf的结果一致 就OK

另外有个问题想咨询下

您好,我想这个截图应该能够解释为什么会出现您所描述的问题,一个是按5进一,一个是按4舍去:

image.png481676024.png
回复 使用道具 举报
yue1859921
初级会员   /  发表于:2024-4-4 11:03:13
14#
本帖最后由 yue1859921 于 2024-4-4 11:30 编辑
前端小白 发表于 2024-4-3 17:16
如果目的是保持一致,不管对错,那么
1. GC.Spread.CalcEngine.Functions.CALC_PRECISION = 17;
2. 把 ...

嗯明白了,那就能保证spreadjs和GcExcel转pdf的结果一致 就OK

另外有个问题想咨询下
WPS里  如果是 55.55-50.00  计算结果保留1位小数   是5.6
为什么 55.55-55.00 计算结果保留一位小数 是0.5
回复 使用道具 举报
前端小白
初级会员   /  发表于:2024-4-3 17:16:10
13#
yue1859921 发表于 2024-4-3 12:48
1.那 比如wps里 按照我这个示例  计算出来  是0.5  还是0.6?
2.怎么保持spreadjs 和gcexcel 值 保持一 ...

如果目的是保持一致,不管对错,那么
1. GC.Spread.CalcEngine.Functions.CALC_PRECISION = 17;
2. 把精度调成0.00 (你这个文件里,要把条件格式上的格式调整为0.00)

1或者2都阔以,个人推荐2,如果我前面说的,精度问题,就用精度妥协来打败。这样至少避免大精度损失么。
回复 使用道具 举报
yue1859921
初级会员   /  发表于:2024-4-3 12:48:03
12#
本帖最后由 yue1859921 于 2024-4-3 12:49 编辑
前端小白 发表于 2024-4-3 10:49
这就是我说的问题啊。
0.14 -> 0.0,就变成0.1
0.15 -> 0.0,   就变成0.2

1.那 比如wps里 按照我这个示例  计算出来  是0.5  还是0.6?
2.怎么保持spreadjs 和gcexcel 值 保持一致  ?  设置spreadjs?

GC.Spread.CalcEngine.Functions.CALC_PRECISION = 17// 这里的17其实指的是有效数字(不仅仅是小数)
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2024-4-3 12:31:11
11#
前端小白 发表于 2024-4-3 10:49
这就是我说的问题啊。
0.14 -> 0.0,就变成0.1
0.15 -> 0.0,   就变成0.2

回复 使用道具 举报
前端小白
初级会员   /  发表于:2024-4-3 10:49:13
10#
这就是我说的问题啊。
0.14 -> 0.0,就变成0.1
0.15 -> 0.0,   就变成0.2

这类问题,不是说保持一致不一致的问题,而是怎么去弱化这类问题。因为无法消除双精度浮点数误差。
从你的描述上,核心问题归纳出来不是
1. GcExcel和Excel算的一样,虽然结果是错的。
2. SpreadJS和Excel算的不一样,但是结果是对的。

你要是的一个正确的计算结果,还是第一个错误的和Excel一样的数据。

从某种意义上来说,诉求矛盾了,这就是我说的,应该放宽格式化的精度,来弱化这种问题。
因为这类问题避免不了的

评分

参与人数 1金币 +200 收起 理由
Richard.Huang + 200 很给力!

查看全部评分

回复 使用道具 举报
yue1859921
初级会员   /  发表于:2024-4-3 10:10:32
9#
本帖最后由 yue1859921 于 2024-4-3 10:15 编辑
前端小白 发表于 2024-4-3 09:23
目测这是限制,引申到IEEE754的双精度浮点数的运算精度问题了。https://en.wikipedia.org/wiki/IEEE_754
...

这个原因对于计算机专业的了解,但是用户用表格来做数据的计算 肯定按实际肉眼看到的为主,
50.55-50.0  就算就是等于0.55 一位后 0.6
既然 spreadjs 表格都计算出 等于0.6   怎么能在GCEXCEL里 保证一致?
回复 使用道具 举报
前端小白
初级会员   /  发表于:2024-4-3 09:40:47
8#
yue1859921 发表于 2024-4-2 19:48
SpreadJS,单元格计算结果为0.55   这个值 的确是一个正确的值  根据表格里的公式我自己手算也是0.55啊
...

所以俺们在设计表格的时候,尽量会放宽精度,向这种0.0,很容易出现精度误差。
0.14 -> 0.0,就变成0.1
0.15 -> 0.0,   就变成0.2

少了0.01,肉眼看到的带来的精度是0.1, 如果这个数据是需要肉眼审核的,比如打印或导出,那么将是非常危险的。曾看到一实验室数据报告就这个类型,真怕他们搞实验弄炸了。
回复 使用道具 举报
yue1859921
初级会员   /  发表于:2024-4-2 19:48:25
6#
本帖最后由 yue1859921 于 2024-4-2 20:00 编辑

SpreadJS,单元格计算结果为0.55   这个值 的确是一个正确的值  根据表格里的公式我自己手算也是0.55啊
我在Excel里用按照公式算也是0.55

为什么在系统里会变成0.549999999999970 ,这个值是怎么得来的 ?本身也没有无穷小数        这和实际值有差异。 明明计算出来是0.55,在系统里一算变成0.5
对于用户根本不了解这里的所以然,只会拿实际看到的值去计算



回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部