搞不明白的 双精度类型
语言描述可能有点绕,看源码,就3行
运行结果如下:
调试输出的结果如下:
虽然看起来相等,但就是不相等!!!(原谅我只能这么表达)
猜想应该是数据转换出了问题,请各位老师科普一下因果,以及怎么样才能相等呢?
不要改运行逻辑
程序和源码如下:
连接:https://wwqk.lanzouq.com/iPzOl2sfoahc
密码:hz6u
lies 发表于 2025-4-2 13:13
双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样 ...
转换成文字数值为:4421601.757813
直接计算双精度数值为:4421601.7578125
双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样,实际上存储器里的值是不一样的 后面的精度,你可以四舍五入一下 lies 发表于 2025-4-2 13:41
转换成文字数值为:4421601.757813
谢谢大佬指点,牛的牛的,看来不杀到底层,还真不好理解
查了一下,双精度数据宽度是8个字节
还想跟您请教一下有没有什么办法或者思路,能够把这8个字节的宽度里,
使其就等于(a/256)呢,让等号成立
lies 发表于 2025-4-2 13:13
双精度数值通常精确到小数点后 15 到 16 位,你转成文本再转回来就损失了后面的精度,虽然显示看起来是一样 ...
比如我写了一个密码,就是(a/256),然后我把它转换成文本储存下来,发给用户
用户对这个文本进行解读,还是与(a/256)做比较
相等就是密码正确
不相等就是密码错误
(最近在学一点通信,整数型的好理解,double的传输会出问题,唉) DavidLiu 发表于 2025-4-2 15:27
比如我写了一个密码,就是(a/256),然后我把它转换成文本储存下来,发给用户
用户对这个文本进行解读, ...
你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值”的转换再与你发过去的文本比较
2、精度要求高的话,可以指定双精度数值的转换格式,保留小数精度再传给用户,参考:
https://www.jb51.net/article/150206.htm
lies 发表于 2025-4-2 15:58
你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值 ...
好像有点明白了,谢谢大佬指点,我还是先研究研究您提到的方式二。
让右边(a/256)不变的前提下,左边经过文本转换后,还能让等式成立,这样写算法就敢用除法了 lies 发表于 2025-4-2 15:58
你的需求可以用两种方式解决:
1、精度要求不高的话,用户端的程序将双精度数值同样经过“到文本->到数值 ...
大佬我研究了方式二,例子测试下来,它最大还是只能到小数点后5位,就算填入8位,后面也只是用0填充,有没有办法能让小数部分精确到8位?计算器都可以做到,为什么易语言就拉跨了,太难受了
我查到的双精度转为十进制显示,最大有效数字限度是15位(应该是包含整数部分和小数部分)
易语言真的就无解么 DavidLiu 发表于 2025-4-3 11:43
大佬我研究了方式二,例子测试下来,它最大还是只能到小数点后5位,就算填入8位,后面也只是用0填充,有 ...
我特地下了个易语言环境测试,发现易语言的数值转换函数是有限制的
像这样的语句:标准输出 (, 数值到格式文本 (4421601.757813, 15, 假))
想要改成:标准输出 (, 数值到格式文本 (4421601.7578125, 15, 假))
是做不到的,改完会恢复成上面的语句
把整数位减少一位,改为:标准输出 (, 数值到格式文本 (421601.7578125, 15, 假))
就成功了。
所以如果想精度高就不能使用易语言的转换函数,自己写转换函数或把双精度转成十六进制吧,易语言不太懂,你可以 AI 问一下。
页:
[1]
2