所以我尝试在下面的代码中检查小数位,因为我只能使用Ifs(如果您有一个建议,仅使用Ifs可以检查小数)。
double amount = double.Parse(Console.ReadLine());
cents5 = amount / 0.05;
if (cents5 - (int)cents5 == 0)
{
Console.WriteLine(cents5 + " * 5 cents");
}
Console.WriteLine(cents5 + " " + (int)cents5);
但是,例如当我尝试输入150.10作为金额时,控制台将为result5c返回值3002和(int)result5c返回值3001。它很好地适用于其他值idk为什么我在这里不工作。
对不起,如果代码看起来不好,但是我尝试:(。尽管反馈是适当的:D
答案 0 :(得分:1)
问题在于double不是精确的数据结构,很容易导致舍入错误,如果您想获取double的Raw值,则可以使用
Console.WriteLine(cents5.ToString("R"));
这将打印
3001.9999999999995
如果现在将此double
值强制转换为int
,它将截断分数并仅返回
3001
您可以选择几种解决方案
使用精度更高的数据类型来处理诸如decimal
decimal amount = decimal.Parse(Console.ReadLine());
decimal cents5 = amount / 0.05m; //<-- use m after 0.05 to mark it as decimal literal
if (cents5 - (int)cents5 == 0)
{
Console.WriteLine(cents5 + " * 5 cents");
}
Console.WriteLine(cents5 + " " + (int)cents5);
使用int
Convert.ToInt32
double amount = double.Parse(Console.ReadLine());
double cents5 = amount / 0.05;
if (cents5 - Convert.ToInt32(cents5) == 0)
{
Console.WriteLine(cents5 + " * 5 cents");
}
Console.WriteLine(cents5 + " " + Convert.ToInt32(cents5));
舍弃您的double
值的精度
double amount = double.Parse(Console.ReadLine());
double cents5 = Math.Round(amount / 0.05, 2);
if (cents5 - (int)cents5 == 0)
{
Console.WriteLine(cents5 + " * 5 cents");
}
Console.WriteLine(cents5 + " " + (int)cents5);