c - 为什么将浮点值转换为 int 时值会发生变化

标签 c floating-point int cs50

我将金额声明为 float 金额。当我将该值乘以 100 并将其插入“int”变量时,该值更改为 419...为什么会发生这种情况?

#include <stdio.h>
#include <cs50.h>
#include <math.h>

float amount;
int cents, coins, quarters, dimes, nickels, pennies, Q, D, N, P;
int main(void){

do
{
    amount = get_float("How much we talkin?\n");
}
while (amount < 0);
        printf("cents = %.55f\n", amount);
cents = amount * 100;
        printf("cents = %i\n", cents);
quarters = cents % 25;
    Q = cents / 25;
        printf("quarters = %i\n", quarters);
dimes = quarters % 10;
    D = quarters / 10;
        printf("dimes = %i\n", dimes);
nickels = dimes % 5;
    N = dimes / 5;
        printf("nickels = %i\n", nickels);
pennies = nickels % 1;
    P = nickels / 1;
        printf("pennies = %i\n", pennies);
coins = Q+D+N+P;

    printf("%i\n", coins);

}

~/workspace/pset1/cash/ $ ./cash
How much we talkin?
4.2
cents = 4.1999998092651367187500000000000000000000000000000000000
cents = 419
quarters = 19
dimes = 9
nickels = 4
pennies = 0
22

...该链接有帮助。谢谢!

最佳答案

谢谢,我通过将用户的输入作为 float ,将该值乘以 100,然后四舍五入到最接近的整数来解决此问题。下面的代码可以工作,但不是世界上最干净的解决方案。

#include <stdio.h>
#include <cs50.h>
#include <math.h>

float amount;
int cents, coins, quarters, dimes, nickels, pennies, Q, D, N, P;
int main(void){

do
{
    amount = get_float("How much we talkin?\n");
}
while (amount < 0);
    // Print float input to see value is not precise
    printf("amount = %.55f\n", amount);

// Multiply amount by 100, then round to nearest
cents = roundf(amount * 100);
    printf("cents = %i\n", cents);

// *Quarters*
quarters = cents % 25;
    Q = cents / 25;
    printf("quarters = %i\n", Q);

// *Dimes*
dimes = quarters % 10;
    D = quarters / 10;
    printf("dimes = %i\n", D);

// *Nickels*
nickels = dimes % 5;
    N = dimes / 5;
    printf("nickels = %i\n", N);

// *Pennies*
pennies = nickels % 1;
    P = nickels / 1;
    printf("pennies = %i\n", P);

// Add up all the coins
coins = Q+D+N+P;

    printf("%i\n", coins);

}


~/workspace/pset1/cash/ $ ./cash
How much we talkin?
4.2
amount = 4.1999998092651367187500000000000000000000000000000000000
cents = 420
quarters = 16
dimes = 2
nickels = 0
pennies = 0
18

关于c - 为什么将浮点值转换为 int 时值会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073970/

相关文章:

c - 合并 vector 非常快

c - 从 uint8_t 类型数组中提取位

创建二叉树和函数重载和隐藏错误

C:函数未更新全局数组(使用 strcpy/malloc)

JavaScript:整数正则表达式捕获 float 的小数部分

php - 所有系统的浮点运算都一样吗?

java - 为什么 "double z = 1/3"的结果是 0.0?

java - 使用 Java 生成所需范围内的随机数

python - 将 int 转换为固定字符数的字符串

c# - 有没有一种简单的方法可以将 32 位整数转换为 16 位整数?