c - 我不知道为什么 else if 语句没有发生
问题描述
当我输入0.50
或其他可以除以的浮点数时,0.25
我没有收到任何错误,但是当我输入0.10
或其他不能被我编写0.25
的else
if 语句除的浮点数时,不会发生。谁能告诉我为什么?
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void) {
float change;
do {
change = get_float("Change owed: ");
} while (change < 0.009);
int count = 0;
int div = 0;
while (change > 0.00) {
if ((change / 0.25) >= 1.00) {
div = round(change / 0.25);
count += div;
change = change - (div *0.25);
} else
if ((change / 0.10) >= 1.00) {
div = round(change / 0.10);
count += div;
change = change - (div * 0.10);
} else
if ((change / 0.05) >= 1.00) {
div = round(change / 0.05);
count += div;
change = change - (div * 0.05);
} else {
div = round(change / 0.01);
count += div;
change = change - (div * 0.01);
}
}
printf("%i\n", count);
}
解决方案
浮点数 C 的内部表示几乎总是IEEE 754 二进制表示中指定的二进制格式,而不是十进制形式。因此,一些数字在十进制表示法中具有简单的表示,例如在 a甚至在变量0.1
中没有精确表示。将此变量乘以不一定会产生精确的值,而是与 不同的非常接近的浮点数。比较浮点数时应该非常小心,考虑到舍入方法的传播带来的微小差异。特别是,您应该避免使用或float
double
10
1
1
float
double
对于精确的美分数很重要的货币值:使用一个整数来保存美分的数量,并具有足够大的大小来处理计算出的数字。对于以美分表示的超过 2000 万美元的数字,常规 32 位int
是不够的。
这是使用long int
至少 32 位大小的修改版本:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void) {
float change = get_float("Change owed: ");
long int cents = round(change * 100); // get an exact number of cents.
long int count = cents / 25; // number of quarters
cents %= 25;
count += cents / 10; // number of dimes
cents %= 10;
count += cents / 5; // number of nickels
cents %= 5;
count += cents; // number of pennies
printf("%ld coins\n", count);
return 0;
}
推荐阅读
- php - Laravel 中的递归排序
- microsoft-teams - 使用连接器开发我公司的产品与 Microsoft Teams 的集成
- javascript - 守护进程在打开 ttyACM0 后获取控制接口并接收 SIGHUP
- angularjs - 角度数据表最小化观察者
- c++ - 在编译时根据某些条件生成一个字符串
- angular - 角度 Firebase 托管不起作用
- javascript - 动态生成 HTML 元素到 PHP 电子邮件表单
- c# - 返回的方法与返回变量的结果不同
- javascript - 如何从上传的图像中获取日期?
- javascript - array.map 后未定义的值 - react.js