gpt4 book ai didi

c - 打印 float 和 int 的值以进行简单计算(值不相加)

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:27 24 4
gpt4 key购买 nike

在设计用于将美元值输入转换为其可能组成部分的程序的 float /整型计算时遇到问题。例如,如果您输入 $1234.56,程序将输出“1 张 1000 美元钞票、2 张 100 美元钞票、1 张 20 美元钞票、1 张 10 美元钞票、4 张 4 美元钞票、2 夸特、1 镍和 1 美分。”

最大的问题是计算便士。如果用户输入 $.03,输出会有所不同(有时,我得到 3 美分;其他时候,我得到 2 美分)。我想我现在已经解决了这个问题,但我想了解为什么我解决了它,更重要的是我想解决潜在的问题:在计算流的某个地方,编译器似乎“削减”了值(value)(例如.01 变为 .009999)。是因为我正在对同一个变量(即“金额”)执行递归计算吗?有没有更干净的方法来做我想在这里做的事情? (我仅限于 switch/if 选择语句,没有使用函数,也没有使用数组。)

完整代码链接 here .

#include <stdio.h>

int main(){

float amount, bill_quarter_f, bill_dime_f, bill_nickel_f, bill_penny_f;
int bill_quarter, bill_dime, bill_nickel, bill_penny;

printf("Ex 5.15: Translating Decimal Dollar into Coins\n");
printf("==============================================\n\n");

printf("Enter your amount (e.g .98): $ ");
scanf("%f", &amount);

/************************************/
/* Calculation for greater than MAX */
/************************************/

if (amount >= 1)
printf("\nYou have too much money!\n\n");

/************************************/
/* Calculation for Coins */
/************************************/

else if(amount < 1 && amount > 0){
bill_quarter = amount / .25;
bill_quarter_f = amount / .25;
amount = ((bill_quarter_f - bill_quarter) * .25);


(bill_quarter >= 1 && bill_quarter < 4) ? (printf("You have %d quarters\n", bill_quarter)) : (printf(""));

bill_dime = amount / .10;
bill_dime_f = amount / .10;
amount = (bill_dime_f - bill_dime) * .10;


(bill_dime >= 1 && bill_dime <= 2) ? (printf("You have %d dimes\n", bill_dime)) : (printf(""));

bill_nickel = amount / .05;
bill_nickel_f = amount / .05;
amount = (bill_nickel_f - bill_nickel) * .05;


(bill_nickel >= 1 && bill_nickel < 2) ? (printf("You have %d nickel\n", bill_nickel)) : (printf(""));

bill_penny = amount / .01;
bill_penny_f = amount / .01;
amount = (bill_penny_f - bill_penny) * .01;

(bill_penny_f > 0 && bill_penny_f < 5) ? (printf("You have %.0f pennies\n", bill_penny_f)) : (printf(""));
}

else if (amount == 0)
printf("You have no money!\n");
else
printf("You are in debt!\n");

return 0;
}

最佳答案

将二进制 float 用于财务代码有各种缺陷。 OP的代码展示了其中的一些。在没有解决其他表示金钱的方式(每种方式都有其优点和缺点)的情况下,此答案提供了改进 double 使用金钱的方法,因为它适用于 OP 的代码。

  1. 金钱的不准确表述

召回一个binary64 double 通常可以完全 表示大约 264 个不同的数字。 0.10 不是其中之一。所以下面的商通常会得到一个非整数。

float amount;
...
amount / .10;

将商分配给 int 会导致截断值。如果 quotient 是 1.9999...,bill_dime 将取值 1。

int bill_dime;
...
bill_dime = amount / .10;
  1. 无法控制不是 0.01 的精确倍数的输入。

如何处理像 "0.125" 这样的用户输入 --> amount = 0.125

0.125 可以精确表示为 double,因此输入时不存在舍入问题。然而,代码并未解决如何舍入这样的值或如何处理 0.01 的小数部分。

  1. 无法控制输入的舍入值。

如何处理像 "0.10" 这样的用户输入 --> 该值不能准确表示?因此附近的 amount = 0.10f 结果。

value 采用 float0.01f接近 0.01,可能与 0.01。此差异可能会导致 amount/.10; 出现意外结果。混合使用 doublefloat 导致了这个问题。


对于采用 FP 的财务代码,请勿使用 float - 问题太多。

对于OP学习者使用FP和金融代码,建议将FP输入转换为整数进行找零计算。由于下面的long转换肯定不会溢出,所以OF的这个顾虑可以搁置。

printf("Enter your amount (e.g .98): $ ");
double amount;
if (scanf("%lf", &amount) != 1) Handle_NonNumericInput();

if (amount >= 1.0 || amount < 0.0)
printf("\nYou have too much/too little money!\n\n");

现在转向整数

 else {
// round ... to the nearest integer value, rounding halfway cases away from zero,
long cents = lround(amount * 100.0);
// 0 <= cents <= 100
// Need to decide how to handle cents == 0 or cents == 100 here.

bill_quarter = cents / 25;
cents %= 25;

if (bill_quarter) {
printf("You have %d quarters\n", bill_quarter);
}

bill_dime = cents / 10;
cents %= cents % 10;

if (bill_dime) {
printf("You have %d dimes\n", bill_dime);
}

未成年人

// "You have %d nickel"
"You have %d nickels"

关于c - 打印 float 和 int 的值以进行简单计算(值不相加),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com