每当我在此代码中输入 4.2 时,nm 的值为 19,其中预期为 20
Whenever I enter 4.2 in this code, the value of nm is 19, where 20 is expected
我想在变量 nm 中得到 20。但它返回 19.
我该如何解决?是什么导致了这个问题?
#include <stdio.h>
#include <cs50.h>
#include <math.h>
int main(void)
{
float m;
int n = 0;
do {
m = get_float("Enter:");
}while(m < 0);
int nm =(m * 100 );
while(nm >= 25 ){
nm = nm - 25;
n = n + 1;
}
printf("%i\n",n);
printf("%i\n", nm);
}
一个 32 位 float
可以编码大约 232 个不同的值 正好 。由于典型 float 的二进制性质,4.2 不是其中之一。
相反 m
的值为 4.1999998...
// closest float
4.19999980926513671875
// hoped for value
4.2
// next closest float
4.200000286102294921875
多路复用 100 会导致一些舍入,因此 m*100
的最佳答案是 419.999969482421875
。
int nm =(m * 100 );
结果 nm == 419
因为将 float
赋值给 int
会截断小数部分。
考虑四舍五入到最接近的整数而不是通过 int
赋值截断并使用 double
常量。
#include <math.h>
// int nm =(m * 100 );
int nm = lround(m * 100.0);
// or
int nm = round(m * 100.0);
我想在变量 nm 中得到 20。但它返回 19.
我该如何解决?是什么导致了这个问题?
#include <stdio.h>
#include <cs50.h>
#include <math.h>
int main(void)
{
float m;
int n = 0;
do {
m = get_float("Enter:");
}while(m < 0);
int nm =(m * 100 );
while(nm >= 25 ){
nm = nm - 25;
n = n + 1;
}
printf("%i\n",n);
printf("%i\n", nm);
}
一个 32 位 float
可以编码大约 232 个不同的值 正好 。由于典型 float 的二进制性质,4.2 不是其中之一。
相反 m
的值为 4.1999998...
// closest float
4.19999980926513671875
// hoped for value
4.2
// next closest float
4.200000286102294921875
多路复用 100 会导致一些舍入,因此 m*100
的最佳答案是 419.999969482421875
。
int nm =(m * 100 );
结果 nm == 419
因为将 float
赋值给 int
会截断小数部分。
考虑四舍五入到最接近的整数而不是通过 int
赋值截断并使用 double
常量。
#include <math.h>
// int nm =(m * 100 );
int nm = lround(m * 100.0);
// or
int nm = round(m * 100.0);