当前位置:  开发笔记 > 开发工具 > 正文

通过Delphi中的writeln/readln实现的实数精度

如何解决《通过Delphi中的writeln/readln实现的实数精度》经验,为你挑选了1个好方法。

我的客户端应用程序使用writeln和readln通过文本文件导出和导入相当类型的变量.我试图增加所写字段的宽度,使代码如下所示:

writeln(file, exportRealvalue:30); //using excess width of field
....
readln(file, importRealvalue);

当我导出然后再次导入和导出并比较文件时,我得到了最后两位数的差异,例如(可能在这里的实际位数上有关,但你得到它):

-1.23456789012E-0002
-1.23456789034E-0002

这实际上对应用程序产生了影响,因此客户想知道我能做些什么.现在我不确定它只是写/读这样做但是我想在我再次潜入嘿堆栈之前我会抛出一个快速的问题.我需要二进制吗?

这不是处理货币或其他东西的应用程序,我只是在文件中写入和读取值.我知道浮点有时候有点奇怪,我认为其中一个例程(writeln/readln)可能会有一些有趣的业务.



1> Jim McKeeth..:

您可以尝试切换到扩展以获得更高的精度.正如所指出的那样,浮点数只有很多有效精度数字,因此仍然可以显示更多数字然后准确存储,这可能会导致您指定的行为.

来自Delphi的帮助:

基本的Win32真实类型

                                            | Significant | Size in 
Type     | Range                            | digits      | bytes
---------+----------------------------------+-------------+----------
Real     | -5.0 x 10^–324 .. 1.7 x 10^308   | 15–16       |   8  
Real48   | -2.9 x 10^–39 .. 1.7 x 10^38     | 11-12       |   6   
Single   | -1.5 x 10^–45 .. 3.4 x 10^38     |  7-8        |   4   
Double   | -5.0 x 10^–324 .. 1.7 x 10^308   | 15-16       |   8   
Extended | -3.6 x 10^–4951 .. 1.1 x 10^4932 | 10-20       |  10   
Comp     | -2^63+1 .. 2^63–1                | 10-20       |   8   
Currency | -922337203685477.5808..          |             | 
                    922337203685477.5807    | 10-20       |   8   

注意:在早期版本的Object Pascal中,六字节Real48类型称为Real.如果要重新编译在Delphi中使用较旧的六字节Real类型的代码,您可能需要将其更改为Real48.您还可以使用{$ REALCOMPATIBILITY ON}编译器指令将Real转换回六字节类型.以下评论适用于基本实物类型.

维护Real48是为了向后兼容.由于其存储格式不是英特尔处理器架构的原生格式,因此导致性能低于其他浮点类型.

扩展提供比其他实际类型更高的精度,但便携性较差.如果要创建要跨平台共享的数据文件,请小心使用Extended.

请注意,范围大于有效数字.所以你可以有一个更大的数字然后可以准确存储.我建议四舍五入到有效数字以防止这种情况发生.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有