delphi 四舍五入的坑

Posted 530263009qq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 四舍五入的坑相关的知识,希望对你有一定的参考价值。

var
d:Double;
begin
// ShowMessage(FloatToStr(RoundTo(17.165,-2))+‘________‘+FloatToStr(RoundTo(17.165*100.0,0)/100.0)+
// ‘________‘+FormatFloat(‘0.00‘,17.165));
// //17.16________17.16________17.17
// ShowMessage(FloatToStr(RoundTo(33.015,-2))+‘________‘+FloatToStr(RoundTo(33.015*100.0,0)/100.0)+
// ‘________‘+FormatFloat(‘0.00‘,33.015));
// //33.01________33.02________33.02
// ShowMessage(FloatToStr(RoundTo(1.165,-2))+‘________‘+FloatToStr(RoundTo(1.165*100.0,0)/100.0)+
// ‘________‘+FormatFloat(‘0.00‘,1.165));
// //1.17________1.16________1.17
d:=1.005;
ShowMessage(FloatToStr(RoundTo(d,-2))+‘________‘+FloatToStr(RoundTo(d*100.0,0)/100.0)+
‘________‘+FormatFloat(‘0.00‘,d)+‘________‘+FormatFloat(‘0.00‘,StrToFloat(FloatToStr(d))));
//1________1________1.00________1.01

//在DELPHI中Round()和RoundTo()都是四舍五入的函数,但DELPHI用的四舍五入与一般的四舍五入不同,它采用的是四舍六入五留双。
//
//即当舍或入位大于或小于五时按四舍五入来处理,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。
//
//这种算法其实是按照银行家算法,统计学上一般都用这种算法,比传统的"四舍五入"要科学。在VB、.net相关的语言中都有这个问题。
//
//例如:
//
//表达式 返回值
//
//Round(11.5) 12
//
//Round(10.5) 10
//
//RoundTo(1234567, 3) 1234000
//
//RoundTo(1.234, -2) 1.23
//
//RoundTo(1.235, -2) 1.24
//
//RoundTo(1.245, -2) 1.24
//
//如果要使用传统的"四舍五入"方法,可以使用下面函数:
//
//function RoundEx(R: Real): Int64;
//
//begin
//
//Result:= Trunc(R);
//
//if Frac(R) >= 0.5 then
//
//Result:= Result + 1;
//
//end;
//
//function DRound(const Value: Extended; const Digit: Byte = 0): Extended;
//
//var
//
//tmp: Extended;
//
//begin
//
//tmp := Power(10, Digit);
//
//if Value > 0 then
//
//Result := Value * tmp + 0.5
//
//else
//
//Result := Value * tmp - 0.5;
//
//Result := Trunc(Result) / tmp;
//
//end;

end;

 

综上所述 推荐使用:FormatFloat(‘0.00‘,StrToFloat(FloatToStr(d)))

以上是关于delphi 四舍五入的坑的主要内容,如果未能解决你的问题,请参考以下文章

Java DecimalFormat四舍五入的坑及正确用法

DecimalFormat 四舍五入Float类型的坑

delphi 小数点四舍五入问题

Delphi编写程序,用 FloatToStr转换文本,怎样四舍五入保留两位小数

C++和Delphi工程0.5四舍五入问题的的排查

delphi 中“/”和div的区别是啥?