delphi - 在Delphi中删除数字整数的最后3个符号

标签 delphi integer rounding

我想在 Delphi 中将这个数字(12345678)四舍五入到(12345000)。我怎样才能做到这一点?我搜索了很多,但我没有找到任何东西。 (SQL 中类似的代码是 Round(x,-3,1))。我也不知道如何使用(GetRoundMode)。
谢谢 :)

最佳答案

一个更快的版本(不是很重要)是这样的:

function RoundDownToThousand(Value: Cardinal): Cardinal;
begin
  Result := Value - Value mod 1000
end;

与 David 提供的 2(div 和乘法)相比,这只会产生一个“昂贵的”操作(mod 运算符)。

然而,有效的速度增益可能可以忽略不计。

编辑:就像我说的,根据大卫和我自己的测试,速度增益可以忽略不计,并且很大程度上取决于你的电脑当时正在做的其他事情。我什至尝试了我的例程的优化 32 位汇编器版本(最终看起来与 Delphi 从 PASCAL 源提供的版本几乎相同,但有一些调整)并且大多数情况下它的运行速度快了几毫秒,但在某些情况下比其他情况慢得多 - 再次暗示时间将很大程度上取决于您的 PC 正在执行的其他操作。

正如 Ken 指出的那样,假设它更快是一种不好的形式——从 PASCAL 代码的外观来看,它肯定会显得它应该更快(只有一个“昂贵”的操作),但就像 David 所说的那样,不应该总是想当然。推送/弹出通用寄存器的需要使其速度减慢到足以使其与其他功能相同。

编辑^2:如果我对优化的 32 位汇编程序例程进行编码,使其不会推送/弹出所需的 32 位寄存器(我检查了生成的代码以查看我可以使用的通常应该保留的寄存器) ,代码(在大多数情况下,但不是全部)执行速度比两个 PASCAL 都快,这严重暗示确实是 push/pop 导致看起来更简单的 PASCAL 例程变慢...

但像肯一样,我会选择这个——因为这是我“思考”解决方案的方式,即。我想消除(减去)数字的最后三位数字(我通过计算 MOD 1000 得到)。当我以我设想的方式思考解决方案时,David 的函数 (IMO) 似乎“错误”且过于复杂,但这可能只是人们围绕逻辑问题思考解决方案以可视化解决方案的方式......

关于delphi - 在Delphi中删除数字整数的最后3个符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21904072/

相关文章:

delphi - future 的 Delphi 与 Qt

multithreading - 同时在多个线程上运行的 TIdHttp 的访问冲突

matlab - 在Matlab中有没有办法使用伪数生成器生成特定范围内的数字?

JAVA Dans DBF Library,从DBF文件中获取数据,byte[]转int

go - 在 `golang` float64 乘法上进行高精度错误路由的正确方法是什么

Java,将 double 舍入到小数点后两位(舍入到 0.05)

delphi - 如何解决 Delphi 2010 应用程序中未处理的 win32 异常?

delphi - 所需的包 'bdertl'/'vcljpg' 未找到从 Delphi2007 升级到 DelphiXE7

python - 为什么 math.modf 返回 float ?

Excel VBA 方法 ROUND 不正确