我总是被告知永远不要代表钱double或float类型,这次我向你提出问题:为什么?
我确信有一个很好的理由,我根本不知道它是什么.
我看过这个问题,似乎情况不一样。
我正在编写的检查注册程序中有一个函数,它从用户那里读取美元金额,验证它没有输入小数美分,并与用户核对输入是否正确。但是,我得到的是,在将输入的浮点值乘以 100 并用 截断后(int),值会发生变化。例如,如果我输入 1118.58,我可以(通过调试printf语句)验证 1118.58 是否被amt正确扫描并分配给,并且我的while条件(int)100 * amt == 100 * amt正确测试为TRUE,但转换为整数后,整数值存储为 111857。更令人困惑的是,并不是每个值都会发生这种情况(尽管我刚刚在测试中进展顺利,这是我看到的第一个以这种方式改变的条目)。
我在 Kubuntu 14.04 64 位上使用 gcc,在我的编译命令中使用 C99 标准设置。这是出现问题的函数(假设您不想/不需要查看完整程序的 1300 行)。注意:为了方便起见,我在头文件中定义了布尔值和运算符——我最近发现有一种标准方法可以做到这一点,但还没有转换我的头文件。
int get_amt (void)
{
float amt;
int scanned, i_amt;
int success = FALSE;
char yn = '\0';
while (NOT success)
{
scanned = scanf("%f%*c", &amt);
/* validate and verify amount */
if (scanned >= 1 AND (int)100*amt == 100*amt AND amt …Run Code Online (Sandbox Code Playgroud)