2017-06-03 64 views
0

我正在通过一门C++课程,并被要求分别制作一个带有美元和美分变化的简单收银程序。我在减去cpp整数时丢失了一个数字

这样做,我遇到了一个例子,如果我cout我的cout<<change*100 - dollars*100<<endl;的计算正确得到40美分。

但是,当我设置INT cents = change * 100 - dollars * 100;然后cout<<cents<<endl;我得到39

这是因为我使用有一个我不知道的一些意想不到的后果中的数据类型?这里是整个程序:

#include <iostream> 
using namespace std; 

int main() 
{ 
    double price, paymentAmount, change; 
    int dollars, cents; 

    price = 23.00; 
    paymentAmount = 24.40; 

    cout<<"total: "<<price<<endl; 
    cout<<"paid: "<<paymentAmount<<endl; 

    change = paymentAmount-price; 

    dollars = change; // implicit conversion from double -> int 
    cents = change * 100 - dollars * 100; 

    cout<<"dollars: "<<dollars<<endl; 
    cout<<"cents: "<<change*100 - dollars*100<<endl; // outputs 40 
    cout<<"cents: "<<cents<<endl; // outputs 39 

    return 0; 
} 

感谢您的帮助

编辑:

原来这是来自转换双为int,其截断小数。我的号码是39.99999,但在转换为int时被截断为39。我认为转换方面使得这是一个非重复问题

+1

的[是浮点运算坏了吗?(可能的复制https://stackoverflow.com/questions/588004/is-floating-point-math-broken验证) –

+0

为了将来的参考,在处理金钱时不要使用标准浮点类型和算术运算。简单的初学者练习可能就足够了,但一旦你成为初学者,就不要这样做。 –

+0

将货币保存为整数/长整数的长整数,以避免信息丢失,这是由于浮点格式使用大数字或周期性分(由于1/10或1/100无法准确存储在二进制firmat中)所造成的。 – cmdLP

回答

0

问题是change*100 - dollars*100double类型的浮点表达式。当您输出时,这将是四舍五入的

但是,当您将其分配给整数变量时,浮点值为截断,其中小数点被简单地删除。所以,如果你有像39.9这样的东西将舍入到40和截断到39

+0

谢谢,我认为这是一个更清晰的答案初学者,因为它突出了舍入与截断 – user2384374

0

它与decimal point precision有关。在行cents = change * 100 - dollars * 100;由于结果转换为int,因此精度丢失。但在cout<<"cents: "<<change*100 - dollars*100<<endl;结果是在double所以精度不会丢失。

您可以通过下面的语句

double cent2=change * 100 - dollars * 100; 
cout<<cent2<<endl;