两个,Borland公司帕斯卡尔7和Delphi 2007年已经拿到了程序STR这需要一个号码,长度和精度,并把它转换成一个像这样的字符串:如何在Delphi/Borland的帕斯卡尔STR程序轮
str(9.234:5:1, s); // -> s = ' 9.2'
如果舍入是非模糊的,那么一切都很好,但如果不是(0.5 - >向上或向下?)就有问题:它似乎取决于BP中的浮点数据类型,但在Delphi中显然是一致的2007年:
BP:
var
e: extended;
d: double;
begin
d := 2.15;
e := 2.15;
str(d:5:1, s); { -> s = ' 2.1' }
str(e:5:1, s); { -> s = ' 2.2' }
{ but: }
d := 2.25
e := 2.25
str(d:5:1, s); { -> s = ' 2.3' }
str(e:5:1, s); { -> s = ' 2.3' }
我无法找到任何规则如何双打四舍五入,而显然扩展总是四舍五入。
德尔福2007年显然总是独立于数据类型四舍五入。
是否有人知道在BP中舍入是如何完成双值的?
我想知道,因为我正在移植一些使用双打到Delphi 2007的Borland Pascal代码,当我比较输出时,我得到了STR过程中四舍五入造成的不一致。这些对结果无关紧要,但却很难找出重要的差异。
为什么试图弄清楚它是如何工作的,当它可以改变所有的Str()调用到FloatToStr调用时出现问题? – 2010-02-25 19:03:20
他无法更改BP代码。只有将Delphi代码更改为FloatToStr才会向他购买任何东西。 – 2010-02-26 09:53:33
请注意,在传递给Str()之前,double可能会转换为扩展。这意味着扩展后的2.15和2.15之后的扩展可以有不同的值,因此可能会有所不同。否则,接受的答案是正确的:2.25可以精确地表示(.25是2^-2),通过扩展和双精度来表示,而2.15不能。 – 2016-06-06 15:41:57