Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 两台不同计算机中的函数行为_Delphi_Rounding - Fatal编程技术网

Delphi 两台不同计算机中的函数行为

Delphi 两台不同计算机中的函数行为,delphi,rounding,Delphi,Rounding,这个问题很简单也很奇怪! 我用Delphi编写了一个程序,并使用roundto函数。在一台计算机中,1.5四舍五入为2,在另一台计算机中,1.5四舍五入为1。 这怎么会发生 附言:代码------->Roundto(1.5,0) p.S.2:似乎需要更多的信息,所以我发布了更准确的细节。我写了一个程序。他们输入了两个数字:a=7231.76 b=3556.71 现在,如果c>=a-b,他们可以输入第三个数字c,但我代码中的确切形式是 `roundto(c, -1) >= roundto(a

这个问题很简单也很奇怪! 我用Delphi编写了一个程序,并使用roundto函数。在一台计算机中,1.5四舍五入为2,在另一台计算机中,1.5四舍五入为1。 这怎么会发生

附言:代码------->Roundto(1.5,0)

p.S.2:似乎需要更多的信息,所以我发布了更准确的细节。我写了一个程序。他们输入了两个数字:a=7231.76 b=3556.71 现在,如果c>=a-b,他们可以输入第三个数字c,但我代码中的确切形式是

`roundto(c, -1) >= roundto(a, -1) - roundto(b, -1)`
`roundto(a, -1) = 7231.8`
`roundto(b, -1) = 3556.7`
所以

他们进来了

`c = 3675.05`

我跟踪了程序。在一台计算机上显示的是
round(c,-1)=3675.1
,而在另一台计算机上显示的是
round(c,-1)=3675.0
,我认为您遇到了“银行取整”问题,并且您发布了错误的数据:-) Delphi RoundTo实现银行家四舍五入:以.5结尾的奇数向上四舍五入,这是传统的行为,但是。。。以.5结尾的偶数向下舍入! 因此,1.5四舍五入为2.0,但2.5四舍五入为2.0(链接到的参考)

第二种可能性:Delphi的某些版本中存在错误。所有机器中是否都有相同版本的Delphi

第三种可能性:你说的是浮点!它们不是精确的数字!加上和减去它们会创建一个通常不可见的小数的微观世界0.1+0.2!=0.3!! 也许你所看到的.5并不完全是.5,而是.4999999或.500000001。如果要检查它,请进入调试器并检查
c=3675.05
(逻辑表达式)是否为真,如果
round(c,-1)=3675.1
是否为真,依此类推。如果您想探索fp世界,请尝试以下方法:

第四种可能性:如果使用单精度或双精度,则3675.05的四舍五入会发生变化。单曲是3675.1,双曲是3675:-)啊。。。花车的神奇世界:-)

当你想玩数学把戏时,请使用货币类型(它是一个固定点数,没有这些问题)


还有最后一种可能性,但可能性不大:英特尔CPU将双重运算的中间结果存储为80位fp,然后在输出时将其“四舍五入”为64位。某些编译器/语言引入可选优化(如果可能,在程序运行时激活),以使用某些处理器中的SSE2操作码,而不是处理器的FPU。SSE2在64位fp上运行,因此不会向上广播到80位,也不会从80位向下广播。这可能会导致你所看到的。请阅读此处。

我们希望看到奇怪的代码too@Mitch我把它寄出去了。它在PS和PS2中。为了调查像这样的问题,你需要学习精确和科学。无法发布您使用的确切代码,无法指定delphi版本,这些都是您的基本问题。你必须学会更精确。作为一名软件开发人员,学习比什么都不重要更重要。当你处理浮点数时,没有什么比这更简单。您在屏幕上看到的舍入或截断表示只是二进制冰山的一角。读这篇文章:它真的很有趣,谢谢你提供的信息。但我的问题不同。我将编辑我的问题以获取更多信息。@Masoud我刚刚用C#写了这个表达式:(Math.Round(7231.76,1)-Math.Round(3556.71,1)).ToString(“r”),结果是3675.10000000004:-)@DavidHeffernan,因为OP在问题中写的10次中有5次都不是真的发生了什么!所以我推断了它,最终这类问题通过“银行家舍入知识”或“fp是什么知识”解决了。如果你搜索Delphi RoundTo(或C#Math.Round),这些都是这些人的“问题”。@Masoud因为你没有指定你使用的语言版本,你没有指定你使用的变量的“类型”(不,浮点是不够的),你最初的帖子是“这行不行,帮我”。这里的人看不懂海报的意思。
银行家四舍五入+1
我做了10年的注册会计师,但我可以告诉你,没有人使用这种脑死四舍五入。我们要么因为小数不重要而停止运算,要么正确地进行四舍五入运算。
`c = 3675.05`