Delphi中有一个四舍五入取整函数Round。但它是按银行家舍入法的规则实施舍入操作的,Delphi中没有按算术舍入法规则实施舍入操作的四舍五入取整函数。
在Delphi中使用四舍五入函数一直是使用Round,可是有时候发现,使用它得到的答案与我们预期的会不太一样。
举例:i := Round(13.5) 结果: i=14
i := Round(12.5) 结果: i=12
最后得出结论:Delphi的四舍五入看要四舍五入的前一位,奇入偶不入,例如13.5,3是奇数,此时小数点后的5就入,结果是14。12.5因为2是偶数,所以不入,结果是12。
但是我们平时遇到的四舍五入并不需要此操作,所以自定义四舍五入函数,如下:
//自定义的四舍五入函数
//range为小数点后几位
function MyRound(value: Double; range: Integer): Double;
var
DotPos, i, sign: Integer;
Str, s: string;
jw: Boolean; //进位标志
begin
Result := value;
if range = 99 then //不进行四舍五入
Exit;
//先判断正负 四舍五入绝对值 再*sign
if value >= 0 then
sign := 1
else
sign := -1;
value := abs(value);
Str := FloatToStr(value);
DotPos := Pos('.', Str);
jw := False;
if DotPos <> 0 then
begin
if range > 0 then
value := StrToFloat(Copy(Str, 1, DotPos + range))
else
value := StrToFloat(Copy(Str, 1, DotPos - 1));
s := Copy(Str, DotPos + range + 1, 1);
if s <> '' then
begin
i := StrToInt(s);
if i >= 5 then
jw := True;
end;
end;
if jw then
case range of
0: value := value + 1;
1: value := value + 0.1;
2: value := value + 0.01;
end;
Result := value * sign; //Result := value;
end;
路过的点个赞再走,谢谢~😊😊😊😀😀😀