首页 > 其他分享 >DELPHI四舍五入问题解决

DELPHI四舍五入问题解决

时间:2024-08-15 18:17:08浏览次数:8  
标签:四舍五入 Extended FormatFloat DELPHI 解决 ItemSum 0.00

转自http://www.delphitop.com/html/jichu/153.html  感谢原作者。

 

这段时间在用DELPHI做一个财务系统时发现每一行的小计取了两位小数后与用SQL的ROUND查询出来的不一样,在程序中是用FormatFloat('0.00',ItemSum)函数来取值的,再用DXDBGRID网格显视合计,最终与SELECT SUM(ROUND(ITEMSUM,2))得出的结果是不一样的。

例如ItemSum:=1.005,在程序FormatFloat('0.00',ItemSum)就返回是“1”,应该是“1.01”才是。

因为以前做的系统都没有用DXDBGIRD来显视合计, 一直都没留意这个问题,然后新建了一个程序来测试,用FormatFloat('0.00',1.005)得出是“1.01”是正确的,这是怎么回事呢,将1.005付给变量ItemSum再FormatFloat('0.00',ItemSum)就返回是“1”,单步调试时ItemSum一直都是1.005,通过变量同一个数据就有不同的结果。

一开始ItemSum是Double类型的,后来改为Extended后FormatFloat('0.00',ItemSum)就返回是“1.01”了,为什么会这样呢,后来想了一下可能是Double类型,因为在计算机中数是用二进制存储的,而十进制的有限小数转换成二进制可能变成无限小数,所以存储的时候会有一定的误差。在通常情况下,如果要比较两个数的大小,必须通过对它们的求差得到,如比较ItemSum1与ItemSum是否相等,应用abs(ItemSum1-ItemSum1)<0来判断。1.005就变成了1.004999999999999....了。

使用Extended或者FormatFloat('0.00',StrToFloat(FlotToStr(ItemSum)))就解决问题了。

**************************

在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;

标签:四舍五入,Extended,FormatFloat,DELPHI,解决,ItemSum,0.00
From: https://www.cnblogs.com/ynmsnc/p/18361539

相关文章

  • Delphi提高开发效率之GExperts专家的使用说明
    GExperts是一组通过扩展集成开发环境(IDE)来提高Delphi和C++Builer程序员工作效率的工具。是一款开源的IDE扩展专家,由于去外网下载GExperts非常的麻烦,这里直接提供了Delphi7和Delphi11.1下的GExperts安装包,并连带最新源码一起打包,方便大家使用学习。下面直接看他具有哪些功能,留下实......
  • 《帕拉丁装甲》启动受阻:vgcore.dll兼容性问题终极解决策略
    解决《帕拉丁装甲》游戏中遇到的vgcore.dll兼容性问题,可以尝试以下策略来确保游戏顺利启动:1.运行兼容性模式:•右键点击《帕拉丁装甲》的快捷方式或可执行文件,选择“属性”。•切换到“兼容性”标签页,勾选“以兼容模式运行这个程序”,在下拉菜单中选择一个较旧的Windows版......
  • 《血污:月之诅咒 2》msvcr110.dll 丢失难题深度剖析与解决方案探寻
    解决《血污:月之诅咒2》游戏中缺失msvcr110.dll文件的问题,您可以按照以下步骤操作:1.安装VisualC++RedistributablePackages:•缺失的msvcr110.dll文件属于MicrosoftVisualC++的一部分。访问微软官方网站下载并安装适合您操作系统的VisualC++RedistributableforV......
  • 《无畏契约》directx runtime出现错误的原因以及解决方法
    在享受《无畏契约》(Valorant)等射击游戏时,偶尔会遇到DirectXRuntime错误,这可能会导致游戏无法启动或者运行不稳定。本文旨在深入探讨DirectXRuntime错误产生的常见原因,并提供一系列有效的解决方案。一、DirectXRuntime错误的原因1.显卡驱动程序过时显卡驱动程序是连接......
  • msvcr100.dll丢失的解决方法,6招排除故障,轻松解决dll丢失难题!
    msvcp100.dll丢失怎样修复呢?MSVCP100.DLL是微软的动态链接库(DLL)文件,用于确保Windows上程序的正常运行。如果这个文件被删除或损坏,您可能会碰到“msvcr100.dll丢失”的错误。这种错误可能在您尝试打开或安装程序、启动或关闭系统,以及进行Windows安装时出现。有些用户甚至在......
  • 【问题解决】PageOffice打开word文档报错:Office运行时错误,部分系统文件可能丢失或已损
    打开wps,右上角配置和修复工具取消勾选,确定再打开,重新勾选,确定,退出重启电脑,验证。--PS:本人自测成功,有些人的机器安装有MicrosoftOffice,取消之后(不需要重新勾选)就可以了;本人机器只安装了WPS适合这种操作。......
  • 解决GD32新建工程时提示:cannot open source input file “RTE_Components.h“
    自己在keil中搭建GD32工程后,编译会提示找不到“RTE_Components.h“这个文件。这个文件需要使用keil自动生成工程的方式才会有。如果自己手动搭建工程时,GD32的库文件中是没有提示这个文件的。那GD32的例程为什么不会报错呢?看一下例程就会发现。其它GD32提示的例程里面是没有包含......
  • 解决 Docker CE 在无根模式(rootless)下无法通过 IPv6 拉取映像的问题
    折腾一天快把我逼疯了本来Docker对IPv6的支持就不好,再来个rootless,雪上加霜首先,我们要区分DockerEngine和里面的Image。拉取映像是DockerEngine在工作,也就是那个Daemon本身,而不是某个container或image。RootlessDocker使用RootlessKit来管理用户命名......
  • 宏工科技发力包装领域,解决超细粉料包装难点
    在追求高效、精准与环保并重的现代工业制造中,传统包装方式在面对超细粉料等特殊物料时,往往显得力不从心。宏工科技作为物料处理领域的佼佼者,切入散料自动化包装领域,为行业带来了多款一站式包装解决方案。其中,针对超细粉料等特殊物料包装过程易漏粉、易架桥、包装成本高等问题,推......
  • Ubuntu中编译使用ANTs(医学图像配准)含github无法访问问题解决
    目录第一步、修改hosts文件1.打开https://github.com.ipaddress.com/ 2.打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo3.打开hosts文件,并在文件末尾添加如下内容 第二步、编译ANTs1)首先安装git、cmake以及c++编译器2)编译3)配置bin目录,......