C#十进制检查无法正常工作

时间:2018-10-17 14:43:14

标签: c#

所以我尝试在下面的代码中检查小数位,因为我只能使用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

1 个答案:

答案 0 :(得分:1)

问题在于double不是精确的数据结构,很容易导致舍入错误,如果您想获取double的Raw值,则可以使用

Console.WriteLine(cents5.ToString("R"));

这将打印

3001.9999999999995

如果现在将此double值强制转换为int,它将截断分数并仅返回

3001

您可以选择几种解决方案

  1. 使用精度更高的数据类型来处理诸如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);
    
  2. 使用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));
    
  3. 舍弃您的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);