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写小数值用的到文本,高精度写不进去

urenai 发表于 2023-11-10 22:08:14

你要非要个结果,就把这2个值强转到小数。

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

前面加上(小数)

urenai 发表于 2023-11-10 22:24:44

算了把,还是我年轻了。

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

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

<字节集> 总共 8 个字节:
: 00 00 00 00 00 00 00 00                         | ........

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。

如果你需要在火山做高精度计算,不要用立即数,而是把计算过程中的所有值都用变量保存,再进行计算。
页: [1] 2
查看完整版本: 乘法运算,小数点位数多了结果等于0