如何在给定程序中保持正确的输出值而不舍入双值

本文关键字:输出 舍入 不舍 程序 | 更新日期: 2023-09-27 18:15:04

给定一顿饭的餐价(基本成本(、小费百分比(作为小费添加的餐价百分比(和税百分比(作为税添加的餐费百分比(,查找并打印该顿饭的总成本。

条件:一定要使用精确的值进行计算,否则可能会得出不正确的四舍五入结果!

这是我的程序:

static void Main(String[] args)    
{
    double mealCost=Convert.ToDouble(Console.ReadLine());
    int tipPercent=Convert.ToInt32(Console.ReadLine());
    int taxPercent=Convert.ToInt32(Console.ReadLine());
    double tip,tax;
    tip=(mealCost*(tipPercent/100));
    tax=(mealCost*(taxPercent/100));
    double totalCost=mealCost+tip+tax;
    Console.WriteLine("The total meal cost is {0} dollars",totalCost);
    Console.ReadLine();
}

但我的输出是12。

我的预期输出是15。

如果我的样本输入是12.00 20 8

我的计算为tip=2.4tax=0.96totalCost=15.36四舍五入后的值为(round)totalCost=15

但产量为12。

如何在C#中获得正确的输出。有人能给我一些解决这个问题的建议吗。

如何在给定程序中保持正确的输出值而不舍入双值

您要做的是,将tipPercenttaxPercent作为双值,或者在处理除法之前将它们隐式转换为双值,如下所示:

tip = (mealCost * ((double)tipPercent / 100));
tax = (mealCost * ((double)taxPercent / 100));

然后,您将获得问题中指定输入的totalCost=15.36。更聪明的解决方案是:

 double mealCost, tipPercent, taxPercent;
 Console.WriteLine("Enter values for Meal Cost, Tip percentage and tax percentage");
 if (!double.TryParse(Console.ReadLine(), out mealCost))
 {
     Console.WriteLine("Invalid input for meal Cost");
 }
 if (!double.TryParse(Console.ReadLine(), out tipPercent))
 {
     Console.WriteLine("Invalid input for Tip percentage");
 }
 if (!double.TryParse(Console.ReadLine(), out taxPercent))
 {
     Console.WriteLine("Invalid input for Tip tax Percent");
 }
 double tip = (mealCost * (tipPercent / 100));
 double tax = (mealCost * (taxPercent / 100));
 double totalCost = mealCost + tip + tax;
 Console.WriteLine("The total meal cost is {0}", totalCost.ToString("C0"));
 Console.ReadLine();

首先,请将您的数据类型更改为decimal,而不是double,更适合与货币相关的数据类型。

第二,当你进行计算时,C#会尝试返回相同的数据类型,这导致:

tip=(mealCost*(tipPercent/100));    // it will turn tipPercent/100 to int, which is 0
tax=(mealCost*(taxPercent/100));    // same here

你有很多方法可以做到这一点,比如扮演替身:

tip = (mealCost * ((double) tipPercent / 100));

说明100100D(告诉c#它是双(

tip = (meanCost * (tipPercent / 100D));

或者,只需对tipPercenttaxPercent 使用双/十进制

double tipPercent = Convert.ToDouble(Console.ReadLine());

在除法中,你应该至少有一个双精度来获得双精度的答案——你需要做的改变很少——见下面的

static void Main(String[] args) 
{
double mealCost=Convert.ToDouble(Console.ReadLine());
int tipPercent=Convert.ToInt32(Console.ReadLine());
int taxPercent=Convert.ToInt32(Console.ReadLine());
double tip,tax;
tip=(mealCost*(tipPercent/100.0));//change 100 to 100.0
tax=(mealCost*(taxPercent/100.0));//change 100 to 100.0
double totalCost=mealCost+tip+tax;
Console.WriteLine("The total meal cost is {0} dollars",totalCost);
Console.ReadLine();
}

您的问题与以下两行有关:

 tip=(mealCost*(tipPercent/100));
 tax=(mealCost*(taxPercent/100));

这些定义了整数和将返回整数之间的运算。强制转换为双精度或将100声明为双精度,如下所示:100d

您得到的是0,因为您用代码将int值除以int值。除法将结果向零四舍五入,结果的绝对值是最大可能的整数,该整数小于两个操作数的商的绝对值。您可以在这里查看C#是如何处理它的。

若你们改写了你们的小费,税收计算如下。

 tip = (mealCost * tipPercent / 100);
 tax = (mealCost * taxPercent / 100);