C++ double,float,{0.0},{0.0f},what';有什么大不了的?

C++ double,float,{0.0},{0.0f},what';有什么大不了的?,c++,floating-point,double,C++,Floating Point,Double,所以我写了一个小的练习程序,告诉你你需要多少镍币和美分来支付给你的金额。即使数学是正确的,我也不明白为什么程序输出0分。我无法理解问题是什么 // Example program #include <iostream> using namespace std; int main() { const double nickels{0.05}; const double cents{0.01}; int amt_needed_nickels{0}, amt_n

所以我写了一个小的练习程序,告诉你你需要多少镍币和美分来支付给你的金额。即使数学是正确的,我也不明白为什么程序输出0分。我无法理解问题是什么

// Example program
#include <iostream>

using namespace std;

int main()
{
    const double nickels{0.05};
    const double cents{0.01};
    int amt_needed_nickels{0}, amt_needed_cents{0};
    double amt_val{0.06f}; // for 0.06 cents
    double amt_val_copy{amt_val};
    
    amt_needed_nickels = amt_val / nickels;
    if(amt_needed_nickels != 0)
        amt_val -= (nickels * amt_needed_nickels);
    amt_needed_cents =  amt_val / cents;
    
    cout << "If it costs $" << amt_val_copy << ", you'll need:\nNickels: " << amt_needed_nickels << "\nCents: " << amt_needed_cents << "\n";
    cout << "Even though amt_val is " << amt_val << ", and cents is also " << cents << ", and 0.01/0.01 does equal 1, why is amt_needed_cents not 1?\n";
}

//示例程序
#包括
使用名称空间std;
int main()
{
常数双镍币{0.05};
常数双分{0.01};
整数需要五分{0},整数需要五分{0};
双倍金额{0.06f};//0.06美分
双重金额{amt\u val}副本{amt\u val};
所需金额/镍币=金额/镍币;
如果(所需金额/镍币!=0)
金额val-=(镍币*所需金额镍币);
所需金额=金额/美分;

cout浮点计算是不精确的,当你做数学运算时,你会得到非常小的差异,如果你试图检查数字是否完全相等,这将破坏你的程序。例如,
1.2*3
不完全是
3.6
(注意,这并不意味着所有的计算都是不精确的:例如,乘以
2
的任何幂总是精确的:像
1.5*2
1.1/4
这样的事情总是给出尽可能好的答案)这是因为像
1/10
1/100
这样的小数部分不能用二进制精确表示,当我们的硬币以
1/100
(分)为基础时,这是一个问题

在您的程序中,您应该将所有值转换为美分,将硬币表示为整数,然后一切都会正常工作。也就是说,您知道您将要处理的最大分母是
100
,因此您可以将所有值乘以
100
。因此,
nickels
将是
5
cents
将是
1
,所有计算都将是精确的

为避免混淆,以下是整数代码:

int dollars = 100, nickels = 5, cents = 1;

int amt_needed_dollars = amt_val / dollars;
amt_val -= amt_needed_dollars * dollars;
int amt_needed_nickels = amt_val / nickels;
amt_val -= amt_needed_nickels * nickels;
// skipped dividing by cents, because it's '1' anyway
int amt_needed_cents = amt_val;

浮点计算是不精确的,当你做数学运算时,你会得到非常小的差异,如果你试图检查数字是否完全相等,这将破坏你的程序。例如,
1.2*3
不完全是
3.6
(注意,这并不意味着所有的计算都是不精确的:例如,乘以
2
的任何幂总是精确的:像
1.5*2
1.1/4
这样的事情总是给出尽可能好的答案)这是因为像
1/10
1/100
这样的小数部分不能用二进制精确表示,当我们的硬币以
1/100
(分)为基础时,这是一个问题

在您的程序中,您应该将所有值转换为美分,将硬币表示为整数,然后一切都会正常工作。也就是说,您知道您将要处理的最大分母是
100
,因此您可以将所有值乘以
100
。因此,
nickels
将是
5
cents
将是
1
,所有计算都将是精确的

为避免混淆,以下是整数代码:

int dollars = 100, nickels = 5, cents = 1;

int amt_needed_dollars = amt_val / dollars;
amt_val -= amt_needed_dollars * dollars;
int amt_needed_nickels = amt_val / nickels;
amt_val -= amt_needed_nickels * nickels;
// skipped dividing by cents, because it's '1' anyway
int amt_needed_cents = amt_val;
  • 浮点:一个浮点数。它是一个单精度32位数字。更常见
  • Double:就像名字一样,它包含浮点值的“Double”。它是一个双精度64位数字。它更精确,可以容纳更多的小数点
我不是最好的C++,但看起来问题在这里:

int amt_needed_nickels{0}, amt_needed_cents{0};
amt_needed_nickels = amt_val / nickels;

尝试将AMT*NED美分转换为浮点或将其解析/舍入到另一个。不像其他语言(如JS),C++在试图转换类型时很烦人。将两个浮点划分为int,这可能截去了十进制。

UL>
  • 浮点:一个浮点数。它是一个单精度32位数字。更常见
  • Double:就像名字一样,它包含浮点值的“Double”。它是一个双精度64位数字。它更精确,可以容纳更多的小数点
  • 我不是最好的C++,但看起来问题在这里:

    int amt_needed_nickels{0}, amt_needed_cents{0};
    amt_needed_nickels = amt_val / nickels;
    

    试着将AMtxEnEdEffon转换成浮点或是另一种语言(类似JS)。当试图转换这种类型时,C++是恼人的。你把两个浮点划分成一个int,它可能截去十进制。< /P>我认为你要把它变成一个浮点而不是双:<代码>双AtvayVal.0.06F}。;//对于0.06美分

    。默认情况下,0.0是双精度。而0.0f是浮点数。不要在货币计算中使用浮点数,因为浮点数并不精确。
    0.01
    0.05
    0.06
    都没有精确的二进制表示形式。请使用整数,否则,请使用另一个(第三方)支持货币计算的数据类型。是的,我想这就是我刚才计算的,例如double var{0.0f}与float var{0.0}相同但这仍然不能让我理解为什么float和double会产生不同的值,但我想这只是一个需要注意的类型问题。
    0.0f
    是一个
    float
    0.0
    被认为是一个
    double
    。没有理由
    f
    ,除非你需要一个实际的
    float
    ,不是吗他回答了你的问题吗?我想你希望这是一个浮点数而不是一个双精度:
    double amt\u val{0.06f};//对于0.06美分
    。默认情况下,0.0是双精度。而0.0f是浮点数。不要在货币计算中使用浮点数,因为浮点数并不精确。
    0.01
    0.05
    0.06
    都没有精确的二进制表示形式。请使用整数,否则,请使用另一个(第三方)支持货币计算的数据类型。是的,我想这就是我刚才计算的,例如double var{0.0f}与float var{0.0}相同但这仍然不能让我理解为什么float和double会产生不同的值,但我想这只是一个需要注意的类型问题。
    0.0f
    显然是一个
    float
    0.0