乘法运算,小数点位数多了结果等于0
本帖最后由 1980882096 于 2023-11-10 21:48 编辑比如0.2*0.000001结果是0 2*0.000001 结果也是0
这是为什么
解决了,是 到文本这个命令丢失精度,用数值到格式文本就解决了,顺便 @shuimiao的json写小数值用的到文本,高精度写不进去 你要非要个结果,就把这2个值强转到小数。
前面加上(小数) 算了把,还是我年轻了。
<火山程序 类型 = "通常" 版本 = 1 />
变量 f <类型 = 小数>
f = (小数)0.2 * (小数)0.000001
调试输出 (指针到字节集 (取变量地址 (f), 8))
<字节集> 总共 8 个字节:
: 00 00 00 00 00 00 00 00 | ........ 本帖最后由 Xelloss0618 于 2023-11-10 22:54 编辑
因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
你的乘值刚好等于 1e-6,所以在火山里等于 2 * 0 了 X大佬的最专业 X大佬的最专业 X大佬的最专业 Xelloss0618 发表于 2023-11-10 22:47
因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
...
那要是需要这样的计算 用双精度可以吗 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