递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

4

主题

63

帖子

1222

积分

金牌会员

Rank: 6Rank: 6

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

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



回复

使用道具 举报

4

主题

63

帖子

1222

积分

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

346

主题

1600

帖子

6537

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6537
QQ
沙发
发表于 2023-11-10 22:08:14 | 只看该作者
你要非要个结果,就把这2个值  强转到小数。
专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

47

主题

530

帖子

2933

积分

核心用户

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

346

主题

1600

帖子

6537

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6537
QQ
地板
发表于 2023-11-10 22:24:44 | 只看该作者
算了把,还是我年轻了。

<火山程序 类型 = "通常" 版本 = 1 />

变量 f <类型 = 小数>
f = (小数)0.2 * (小数)0.000001
调试输出 (指针到字节集 (取变量地址 (f), 8))

<字节集> 总共 8 个字节:
[00000000]: 00 00 00 00 00 00 00 00                         | ........
专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

26

主题

1900

帖子

6926

积分

核心用户

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

47

主题

530

帖子

2933

积分

核心用户

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

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

使用道具 举报

18

主题

337

帖子

2921

积分

核心用户

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

28

主题

359

帖子

3325

积分

论坛元老

Rank: 8Rank: 8

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

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

使用道具 举报

26

主题

1900

帖子

6926

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
6926
10#
发表于 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。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 09:06 , Processed in 0.099967 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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