2008-09-29 32 views
2

我的客户端应用程序通过使用writeln和readln的文本文件输出和输入相当多的real类型变量。我试着写增加字段的宽度,使代码看起来像:再次进出口Delphi通过writeln/readln实现的精度

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

当我导出,然后和比较的文件,我得到的最后两位数字,如差异(可能是关上的数字在这里的实际数量,但你得到它):

-1.23456789012E-0002 
-1.23456789034E-0002 

这实际上使得在应用程序的不同,因此客户想知道什么我可以做些什么。现在我不确定这是否只是写/读,但我认为在我再次深入嘿堆栈之前,我会提出一个简单的问题。我需要对此进行二元化吗?

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

+0

浮点数有四舍五入的问题。它是什么类型的应用程序,财务,科学等? 查看此线程以获取更多信息:http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c – stukelly 2008-09-29 18:49:46

回答

2

如果你想用WriteLn指定一个真正的精度,使用以下命令:

WriteLn(RealVar:12:3); 

它输出至少为12个位置中的值Realvar和3

+0

+1!多奇怪的事实! – 2010-02-12 01:31:01

0

使用浮点类型时,应该知道指定类型的精度限制。例如,一个4字节的IEEE-754类型只有大约7.5位的精度。一个八字节的IEEE-754类型的有效数字的数量大约增加了一倍。显然,delphi真实类型的精度约为11位有效数字。这样做的结果是,您指定的格式的任何额外数字都可能是噪声,可能导致基本10格式值与基本2浮点值之间的转换。

7

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

从德尔福帮助:

基本的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 

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

  • Real48保持向后兼容。由于其存储格式不是英特尔处理器体系结构的本机特性,因此其性能比其他浮点类型慢。
  • 扩展提供比其他实际类型更高的精度,但便携性较差。如果您要创建数据文件以跨平台共享,请小心使用Extended。

注意,范围是大于所述显著数字。所以你可以有一个更大的数字,然后可以准确地存储。我建议四舍五入到有效数字以防止发生。

0

首先,我会尝试看看是否可以通过使用带有不同参数的Str或增加应用程序中类型的精度来获得任何帮助。 (你有没有尝试过使用扩展?)

作为最后的手段,(警告!解决方法!)我会尝试为客户节省的字符串表示与排序列表的二进制表示一起。在写回浮点值之前,我会看看表中是否有匹配值,其字符串表示形式是已知的,可以用来替代。为了快速找到这个查询,您可以按数字值对其进行排序,并使用二进制搜索来查找最佳匹配。

0

根据精密您需要做多少处理,另一种方法是将数字保留为BCD格式以保留原始准确性。

0

如果不知道您的ExportRealValue和ImportRealValue是什么类型,很难回答这个问题。正如其他人所说,实际类型都有不同的精度。

值得注意的是,与一些想法相反,扩展并不总是更高的精度。 Extended是10-20有效数字,其中Double是15-16。由于您在第十个信号图附近遇到问题,因此您可能已使用扩展。

为了更好地控制读写,您可以自己将字符串转换为字符串,也可以将字符串转换为文件流。至少这样你不必担心,如果读取和写入的背后不好。