如何在给定程序中保持正确的输出值而不舍入双值
本文关键字:输出 舍入 不舍 程序 | 更新日期: 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.4
和tax=0.96
,totalCost=15.36
四舍五入后的值为(round)totalCost=15
。
但产量为12。
如何在C#中获得正确的输出。有人能给我一些解决这个问题的建议吗。
您要做的是,将tipPercent
和taxPercent
作为双值,或者在处理除法之前将它们隐式转换为双值,如下所示:
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));
说明100
到100D
(告诉c#它是双(
tip = (meanCost * (tipPercent / 100D));
或者,只需对tipPercent
和taxPercent
使用双/十进制
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);