我正在做一道CS50题-Half. 我做了这道题,它还算管用,但例如,当我进入的时候:

Bill before tax and tip: 12.50
Sale Tax Percent: 8.875
Tip percent: 20

它的输出是$7.80,而不是$8.17.

进入时:

Bill before tax and tip: 100
Sale Tax Percent: 20
Tip percent: 10

它起作用了.

为什么给出小数是错误的,而给出四舍五入是有效的呢?

#include <cs50.h>
#include <stdio.h>

float half(float bill, float tax, int tip);

int main(void)
{
    float bill_amount = get_float("Bill before tax and tip: ");
    float tax_percent = get_float("Sale Tax Percent: ");
    int tip_percent = get_int("Tip percent: ");

    printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent));
}

// TODO: Complete the function
float half(float bill, float tax, int tip)
{
    float price;
    tax = bill * tax / 100.0;
    tip = (bill + tax) * tip / 100;
    price = bill + tax + tip;
    return price / 2;
}

推荐答案

通过输入

Bill before tax and tip: 12.50
Sale Tax Percent: 8.875
Tip percent: 20

这条线

tax = bill * tax / 100.0;

将判断为

tax = 12.50 * 8.875 / 100.0;

这相当于:

tax = 1.109375;

这条线

tip = (bill + tax) * tip / 100;

因此相当于

tip = (12.50 + 1.109375) * 20 / 100;

这相当于:

tip = 2.721875;

然而,问题是变量tip的类型是int,它只能表示整数.因此,您将指定值2,而不是将值2.721875指定给tip.

要解决这个问题,我建议您创建一个类型为float的新变量,并使用该变量来存储值.

C++相关问答推荐

命名信号量不会像进程之间同步中假设的那样工作

ARM上的Modulo Sim Aarch 64(NEON)

从组播组地址了解收到的数据包长度

为什么在C中二维字符数组会有这样的行为?

如何在C宏中确定 struct 中元素的类型?

使用scanf在C中读取和存储文件中的值

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

C代码在字符串中删除不区分大小写的子字符串的问题

如何在VS 2022中正确安装额外的C头文件

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

变量的作用域是否在C中的循环未定义行为或实现定义行为的参数中初始化?

安全倒计时循环

用于计算位数和的递归C函数

赋值两侧的后置增量,字符指针

按字典顺序打印具有给定字符的所有可能字符串

在我的第一个C语言中观察到的错误';你好世界';程序

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

System V 消息队列由于某种原因定期重置

如何在 C 中的 Postgres 函数的表中 for 循环