Excel-INT到Delphi的转换

Excel-INT到Delphi的转换,excel,delphi,Excel,Delphi,我正试图将Excel工作表翻译成Delphi,却被Excel INT绊倒了。 Excel帮助say的INT向负无穷大舍入。 Excel单元格为: C13-(24*INT(C13/24)) 其中C13初始化为-465.9862462,计算为14.01375378 我能想到的最好的德尔菲是: C13 := -465.9862462; RoundMode := GetRoundMode;// Save current mode SetRoundMode(rmDown); C13 := C13 -

我正试图将Excel工作表翻译成Delphi,却被Excel INT绊倒了。 Excel帮助say的INT向负无穷大舍入。 Excel单元格为:

C13-(24*INT(C13/24))
其中C13初始化为-465.9862462,计算为14.01375378

我能想到的最好的德尔菲是:

C13 := -465.9862462; 
RoundMode := GetRoundMode;// Save current mode
SetRoundMode(rmDown);
C13 := C13 - (24 * (Round(C13 / 24)));
SetRoundMode(RoundMode);// Restore mode
这会产生正确的答案,但是有更好的方法吗?

Delphi也有一个Int函数。甚至有文件记载:

这大体上相当于Excel函数。它也向下舍入,但不是向负无穷大方向舍入。它朝着0的方向四舍五入。所以对于负数,你必须减去1.0:

注: 有人可能倾向于使用System.Math.Floor,因为它已经向负无穷大进位,但它返回一个整数,因此对于大值,可能会出现整数溢出。请注意,在Excel中,每个数字都是双精度的,因此其INT也返回双精度。

Delphi也有INT函数。甚至有文件记载:

这大体上相当于Excel函数。它也向下舍入,但不是向负无穷大方向舍入。它朝着0的方向四舍五入。所以对于负数,你必须减去1.0:

注: 有人可能倾向于使用System.Math.Floor,因为它已经向负无穷大进位,但它返回一个整数,因此对于大值,可能会出现整数溢出。请注意,在Excel中,每个数字都是双精度的,因此其INT也会返回双精度。

简短回答:使用System.Math.Floor函数,它在功能上与Excel INT函数相同

从INT函数的 INTnumber将数字参数向下舍入为最接近的整数。 例如,INT8.9返回8,INT-8.9返回-9

从System.Math.Floor函数的中,我们可以看到Floor将浮点型参数舍入为负无穷大,并返回一个整数。 例如,“地板2.8返回2,地板-2.8返回-3

在Excel C13-24*INTC13/24和Delphi C13-24*FloorC13/24中测试函数都会得到与14.0137538相同的结果。简短回答:使用System.Math.Floor函数,它在功能上与Excel INT函数相同

从INT函数的 INTnumber将数字参数向下舍入为最接近的整数。 例如,INT8.9返回8,INT-8.9返回-9

从System.Math.Floor函数的中,我们可以看到Floor将浮点型参数舍入为负无穷大,并返回一个整数。 例如,“地板2.8返回2,地板-2.8返回-3

在Excel C13-24*INTC13/24和Delphi C13-24*FloorC13/24中测试您的函数都会得到与14.0137538相同的结果。Delphi等效值为:

将变量向负无穷大舍入

德尔福等效值为:

将变量向负无穷大舍入


不,不是。Floor返回一个整数,而Int返回一个浮点值。@鲁迪,是什么让你认为Excel函数返回16位整数?整数的范围有限,而不是双精度。因此,除非我们知道确切的数字,以及它们是否保持在整数范围内,否则从字面上翻译是有意义的,特别是因为使用System.Int@Rudy这很无聊,所有的参数是什么?打开Excel并测试1.23E+25和=INT1.23E+25。两种情况下的结果均为1.23E+25。然后在Delphi测试平台1.23E+25和Int1.23E+25中。事实上,也可以尝试一个大于有符号最大值但小于无符号最大值的值,以获得更多信息。这两个答案都有自己的位置,但取决于OP可能要处理的数字的大小。如果所有的数字都“足够小”,那么地板显然是最实用的。不,不是。Floor返回一个整数,而Int返回一个浮点值。@鲁迪,是什么让你认为Excel函数返回16位整数?整数的范围有限,而不是双精度。因此,除非我们知道确切的数字,以及它们是否保持在整数范围内,否则从字面上翻译是有意义的,特别是因为使用System.Int@Rudy这很无聊,所有的参数是什么?打开Excel并测试1.23E+25和=INT1.23E+25。两种情况下的结果均为1.23E+25。然后在Delphi测试平台1.23E+25和Int1.23E+25中。事实上,也可以尝试一个大于有符号最大值但小于无符号最大值的值,以获得更多信息。这两个答案都有自己的位置,但取决于OP可能要处理的数字的大小。如果所有数字都“足够小”,那么Floor显然是最实用的。是的,对于这些值,即在这种特殊情况下,它可能返回正确的结果。通常,因为Floor返回的是一个整数,所以它可能不返回。是的,对于这些值,即在这个特定的情况下,它可能返回正确的结果。一般来说,因为Floor返回的是一个整数,所以它可能不返回。究竟为什么要删除请求?Tsk,Tsk,Tsk,究竟为什么要删除请求?啧啧,啧啧,啧啧。
function ExcelInt(N: Extended): Extended;
begin
  Result := System.Int(N);
  if (Result <> N) and (N < 0.0) then
    Result := Result - 1.0;
end;