递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 15977|回复: 16
打印 上一主题 下一主题

[视窗] 乘法运算,小数点位数多了结果等于0

[复制链接]

5

主题

76

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
跳转到指定楼层
楼主
发表于 2023-11-10 21:46:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1980882096 于 2023-11-10 21:48 编辑

比如  0.2*0.000001  结果是0           2*0.000001 结果也是0           
这是为什么



回复

使用道具 举报

5

主题

76

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
来自 2#
 楼主| 发表于 2023-11-11 20:33:22 | 只看该作者
解决了,是 到文本这个命令丢失精度,用数值到格式文本就解决了,顺便 @shuimiao  的json写小数值用的到文本,高精度写不进去
回复

使用道具 举报

62

主题

712

帖子

4156

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4156
板凳
发表于 2023-11-10 22:16:53 | 只看该作者
前面加上(小数)
回复

使用道具 举报

29

主题

2703

帖子

9615

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
9615
地板
发表于 2023-11-10 22:47:16 | 只看该作者
本帖最后由 Xelloss0618 于 2023-11-10 22:54 编辑

因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
你的乘值刚好等于 1e-6,所以在火山里等于 2 * 0 了
回复

使用道具 举报

62

主题

712

帖子

4156

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4156
5#
发表于 2023-11-10 23:20:36 | 只看该作者
X大佬的最专业
回复

使用道具 举报

471

主题

2万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
46975
6#
发表于 2023-11-11 09:33:35 | 只看该作者
X大佬的最专业
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

25

主题

445

帖子

3869

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
3869
7#
发表于 2023-11-11 10:30:00 来自手机 | 只看该作者
X大佬的最专业
回复

使用道具 举报

28

主题

381

帖子

4160

积分

论坛元老

Rank: 8Rank: 8

积分
4160
8#
发表于 2023-11-11 10:39:53 | 只看该作者
Xelloss0618 发表于 2023-11-10 22:47
因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
...

那要是需要这样的计算 用双精度可以吗
回复

使用道具 举报

29

主题

2703

帖子

9615

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
9615
9#
发表于 2023-11-11 11:00:14 | 只看该作者
b0y 发表于 2023-11-11 10:39
那要是需要这样的计算 用双精度可以吗

火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的,这并不是约等于 0。

但火山在翻译成 C++ 源码时,是直接给出立即数的计算结果。
比如代码是 double v = 2 *  0.000001,火山翻译出来是 double v = 0;
可以看出火山的这个计算精度很差,本来应该是 0.000002,却给出了 0。

如果你需要在火山做高精度计算,不要用立即数,而是把计算过程中的所有值都用变量保存,再进行计算。
回复

使用道具 举报

5

主题

76

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
10#
 楼主| 发表于 2023-11-11 11:29:54 | 只看该作者
suyan 发表于 2023-11-10 22:16
前面加上(小数)

没用的,都试过
回复

使用道具 举报

5

主题

76

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
11#
 楼主| 发表于 2023-11-11 12:29:12 | 只看该作者
Xelloss0618 发表于 2023-11-11 11:00
火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的 ...

多谢大佬解惑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2026-1-12 08:15 , Processed in 0.096264 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表