【问题标题】:Why does value change when converting floating point value to int [duplicate]为什么将浮点值转换为int时值会发生变化[重复]
【发布时间】:2018-06-28 02:46:39
【问题描述】:

我将金额声明为浮动金额。当我将值乘以 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

...那个链接有帮助。谢谢!

【问题讨论】:

  • 包含实际代码。不是代码链接。尤其是不是指向图像的链接代码..
  • 您需要在此处发布您的代码,而不是在将来可能会消失的某个网站上。
  • 也正确格式化您的代码

标签: c floating-point int cs50


【解决方案1】:

谢谢,我解决了这个问题,将用户输入作为浮点数,将该值乘以 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

【讨论】:

  • 而不是cents = roundf(amount * 100);,考虑cents = lrint(amount * 100.0); long lrint( double arg ) 从C99 开始可用,在一次调用中进行舍入和转换为整数。使用double 100.0 可确保在乘积计算中不会出现some_float * 100 可能发生的四舍五入。
【解决方案2】:

要理解这个问题,您需要了解浮点数是如何以二进制形式存储在内存中的。

您还需要了解 C 的类型转换在转换为整数时会截断浮点数。

数字 4.2 存储为:

  • 1 x 4
  • 0×2
  • 0 x 1
  • 0 x 0.5
  • 0 x 0.25
  • 1 x 0.125
  • 1 x 0.0625
  • 0 x 0.03125
  • 0 x 0.015625
  • 1 x 0.0078125
  • 1 x 0.00390625

总和为 4.199(最终接近 4.199999 - 但绝不是 4.2)

乘以 100 得到 419.999(etc) - 截断得到 419 而不是 420。

解决方案(如您所见)是确保您 ROUND 而不是 TRUNC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多