DavidLiu 发表于 2025-4-2 12:37

搞不明白的 双精度类型



语言描述可能有点绕,看源码,就3行

运行结果如下:




调试输出的结果如下:



虽然看起来相等,但就是不相等!!!(原谅我只能这么表达)

猜想应该是数据转换出了问题,请各位老师科普一下因果,以及怎么样才能相等呢?
不要改运行逻辑




程序和源码如下:
连接:https://wwqk.lanzouq.com/iPzOl2sfoahc
密码:hz6u




lies 发表于 2025-4-2 12:37

lies 发表于 2025-4-2 13:13
双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样 ...

转换成文字数值为:4421601.757813


直接计算双精度数值为:4421601.7578125


lies 发表于 2025-4-2 13:13

双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样,实际上存储器里的值是不一样的

学编程的闹钟 发表于 2025-4-2 13:22

后面的精度,你可以四舍五入一下

DavidLiu 发表于 2025-4-2 15:19

lies 发表于 2025-4-2 13:41
转换成文字数值为:4421601.757813




谢谢大佬指点,牛的牛的,看来不杀到底层,还真不好理解

查了一下,双精度数据宽度是8个字节
还想跟您请教一下有没有什么办法或者思路,能够把这8个字节的宽度里,
使其就等于(a/256)呢,让等号成立

DavidLiu 发表于 2025-4-2 15:27

lies 发表于 2025-4-2 13:13
双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样 ...

比如我写了一个密码,就是(a/256),然后我把它转换成文本储存下来,发给用户

用户对这个文本进行解读,还是与(a/256)做比较

相等就是密码正确
不相等就是密码错误
(最近在学一点通信,整数型的好理解,double的传输会出问题,唉)

lies 发表于 2025-4-2 15:58

DavidLiu 发表于 2025-4-2 15:27
比如我写了一个密码,就是(a/256),然后我把它转换成文本储存下来,发给用户

用户对这个文本进行解读, ...

你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值”的转换再与你发过去的文本比较
2、精度要求高的话,可以指定双精度数值的转换格式,保留小数精度再传给用户,参考:
https://www.jb51.net/article/150206.htm

DavidLiu 发表于 2025-4-2 17:53

lies 发表于 2025-4-2 15:58
你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值 ...

好像有点明白了,谢谢大佬指点,我还是先研究研究您提到的方式二。

让右边(a/256)不变的前提下,左边经过文本转换后,还能让等式成立,这样写算法就敢用除法了

DavidLiu 发表于 2025-4-3 11:43

lies 发表于 2025-4-2 15:58
你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值 ...

大佬我研究了方式二,例子测试下来,它最大还是只能到小数点后5位,就算填入8位,后面也只是用0填充,有没有办法能让小数部分精确到8位?计算器都可以做到,为什么易语言就拉跨了,太难受了

我查到的双精度转为十进制显示,最大有效数字限度是15位(应该是包含整数部分和小数部分)

易语言真的就无解么

lies 发表于 2025-4-3 17:48

DavidLiu 发表于 2025-4-3 11:43
大佬我研究了方式二,例子测试下来,它最大还是只能到小数点后5位,就算填入8位,后面也只是用0填充,有 ...

我特地下了个易语言环境测试,发现易语言的数值转换函数是有限制的
像这样的语句:标准输出 (, 数值到格式文本 (4421601.757813, 15, 假))
想要改成:标准输出 (, 数值到格式文本 (4421601.7578125, 15, 假))
是做不到的,改完会恢复成上面的语句
把整数位减少一位,改为:标准输出 (, 数值到格式文本 (421601.7578125, 15, 假))
就成功了。
所以如果想精度高就不能使用易语言的转换函数,自己写转换函数或把双精度转成十六进制吧,易语言不太懂,你可以 AI 问一下。
页: [1] 2
查看完整版本: 搞不明白的 双精度类型