1980882096 发表于 2023-11-10 21:46:58

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

本帖最后由 1980882096 于 2023-11-10 21:48 编辑

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



1980882096 发表于 2023-11-11 20:33:22

解决了,是 到文本这个命令丢失精度,用数值到格式文本就解决了,顺便 @shuimiao的json写小数值用的到文本,高精度写不进去

suyan 发表于 2023-11-10 22:16:53

前面加上(小数)

Xelloss0618 发表于 2023-11-10 22:47:16

本帖最后由 Xelloss0618 于 2023-11-10 22:54 编辑

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

suyan 发表于 2023-11-10 23:20:36

X大佬的最专业

创世魂 发表于 2023-11-11 09:33:35

X大佬的最专业

weilai 发表于 2023-11-11 10:30:00

X大佬的最专业

b0y 发表于 2023-11-11 10:39:53

Xelloss0618 发表于 2023-11-10 22:47
因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
...

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

Xelloss0618 发表于 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。

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

1980882096 发表于 2023-11-11 11:29:54

suyan 发表于 2023-11-10 22:16
前面加上(小数)

没用的,都试过

1980882096 发表于 2023-11-11 12:29:12

Xelloss0618 发表于 2023-11-11 11:00
火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的 ...

多谢大佬解惑
页: [1] 2
查看完整版本: 乘法运算,小数点位数多了结果等于0