关于C++builder中精度丢失的问题

原创 2015年07月07日 10:24:15

原意:现有应交款项m元,折扣率n(0 < n < 1),折扣金额采取向下取整制,求折扣后金额LastMoney
公式:LastMoney = m - ( m * ( 1 - n ) )

现设m 为 14.25元  折扣率n为0.8 根据公式计算:
int nOrginMoney = 1425;(转换成分为单位进行计算)
double dRebate  = 0.8;

int tempMoney  = nOrginMoney * (1 - dRebate );
int nLastMoney = nOrginMoney - tempMoney ;

上面的做法存在精度丢失的问题,tempMoney 为整形,而等号右边的计算赋值得出的是浮点数,在进行转换的时候会对小数点后面进行截断。虽然这符合向下取整的规则,但是在上面的例子当中,右边 nOrginMoney * (1 - dRebate )算出来的是285.00,而转成Int类型之后放在tempMoney当中时,tempMoney的值为284,究其原因,右边的double计算值在内存当中进行存储的值并非285.00,而应该是284.9999XXXX,而这样直接进行强制转换会照成了精度的丢失。正确的类型转换并向下取整应该如下:

int tempMoney  = nOrginMoney * (100 - (int)(dRebate*100) ) / 100;
将折扣率进行放大并装换成Int进行计算,放大系数由折扣率的精度决定。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用C++Builder写C/S遇到的问题

转自:blog.csdn.net/minpro 编写了一个用来收发消息的客户端,所以做一个简单服务器用来测试:          这里出现了很多问题,而一些参考实例的解决方法都不实用,绕开...

c++builder 多线程问题

一、初识TThread对象 VCL提供了用于多线程编程的TThread类,在这个类中封装了Windows关于线程机制的Windows API,通常将它的实例成为线程对象。线程对象通过封装简化了多线程...

c++builder数据导出到excel中的问题

我正在用c++builder编写一个程序,想将数据库中的记录导出到excel中。 请问用c++builder中的什么控件?代码如何写?     ...

从C++Builder 2007升级到2010遇到的一些问题

 最近从C++Builder 2007升级到2010遇到的一些问题记录在这里便于以后参考 有人问为什么不直接升级到XE?,嘿嘿,已经试过了,95%的问题都是字符串编码问题+5%左右的各种别扭报...
  • xj211
  • xj211
  • 2015-02-15 15:12
  • 393

c++builder调用vc的dll

 联系订阅随笔- 93  文章- 0  评论- 3  c++builder调用vc的dll $bcb/bin目录中有个implib.exe 把你...

C++Builder 中的 Format 函数及其用法。

C++Builder 中的 Format 函数作用与 Delphi 中的是一样的,相信不用我废话了。但是唯一不同的是参数。由于 Delphi 支持“开参数”和动态数组特性,所以 Delphi 中的 F...

Borland决定出售Delphi、JBuilder、C++Builder等IDE产品

====================================================== 注:本文源代码点此下载 =============================...

USB接口ID卡读卡器oem软件/读写卡测试程序及源代码/c++builder源代码 (2)

详细代码如下(如有疑问可13826029618进行咨询或者获取源代码)   //------------------------------------------------------------...

c++builder使用XMLDocument操作XML进行增,删,改,读!

//头文件 #include #include #include //操作 //定义变量 AnsiString GameTDJpath;//只能是AnsiString类型 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)