代码之家  ›  专栏  ›  技术社区  ›  user3127554

除以两个小数,将结果转换为int

  •  4
  • user3127554  · 技术社区  · 7 年前

    我试图将除法结果转换成c中的int#

    这是我的代码:

    decimal testDecimal = 5.00; // testDecimal always is dividable by 0.25 with 0 rest
    int times=0;
    
    int times = testDecimal / Convert.ToDecimal(0.250); 
    
    // error returned -> Cannot implicitly convert type 'decimal' to 'int'.
    

    如果我把演员换成

    int times = (int) testDecimal / Convert.ToDecimal(0.250); 
    //also returns an error: Cannot implicitly convert type 'decimal' to 'int'
    

    如何将结果(20)作为整数?我做错什么了?

    8 回复  |  直到 7 年前
        1
  •  3
  •   Andrew Drake    7 年前

    试试这个:

     times = (int)(testDecimal / Convert.ToDecimal(0.250));
    

    如果没有额外的括号,它将尝试只将testdecimal转换为integer,然后尝试隐式地将int/decimal结果转换为integer,这就是导致错误的原因。

    在一个不相关的注释中,您试图声明变量“times”两次。

        2
  •  3
  •   Haytam    7 年前

    正如每个人所回答的,您必须添加括号来转换除法的结果,而不是仅仅尝试转换第一部分,然后在除法后得到错误。

    我还想指出,没有必要使用 Convert.ToDecimal 只需将常量声明为adecimal,就可以使用 C# suffixs 为此:

    int times = (int)(testDecimal / 0.250m);
    
        3
  •  1
  •   Nova Ardent Ramgy Borja    7 年前

    你得把整个除法的结果都投出来。试试看:

    int times = (int) (testDecimal / Convert.ToDecimal(0.250)); 
    

    但要小心,因为这可能会遭受看似随机的浮点运算错误,这取决于您使用的值。 https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

    您可以先舍入该值以避免出现这种情况。

    (int) Math.Round(testDecimal / Convert.ToDecimal(0.250));

        4
  •  0
  •   Steve    7 年前

    首先你不需要转换成十进制,你只需要 0.25m

    然后你就可以

    times = (int) (testDecimal / 0.25m);
    

    请注意,如果数字太大,这可能会给你错误的结果。

        5
  •  0
  •   Hossein Golshani    7 年前

    如果要将数字文本视为十进制,请使用后缀 m M .这样就不用了 Convert.ToDecimal 是的。

    decimal testDecimal = 5.00M;
    int times = (int)(testDecimal / 0.250M);
    
        6
  •  0
  •   Jasone .L    7 年前

    首先,您应该在testdecimal声明中添加“m”后缀,否则您的5.00是一个小后缀,而不是一个小数。

    decimal testDecimal = 5.00M;
    

    现在,编译器不知道除法结果是整数。即使你的设计可以被归类为“int”,对他来说,被别人划分的十进制数是十进制数,而不是整数。你必须隐式地投下它:

    int times = (int)(testDecimal / 0.250M);
    

    对我来说很有魅力。

        7
  •  0
  •   Kyle B    7 年前

    将表达式括在括号中,以便可以转换它:

    // int times = (int)testDecimal / 0.250m; 
    int times = (int)(testDecimal / 0.250m); 
    

    请注意,转换时请确保尝试/捕获,因为并非所有 decimal 价值观可以融入 int 是的。

    try
    {
        times = (int)decimal.MaxValue;
    }
    catch(OverflowException ex)
    {
        // Value was either too large or too small for an Int32.
    }
    
        8
  •  0
  •   Flydog57    7 年前

    我不知道你为什么要改信,现在是0.250。为什么要在运行时将浮点(0.250)转换为十进制?为什么不直接使用十进制文字(比如0.25m)?正如其他人所指出的,您需要将除法的结果转换为int,例如:

    decimal testDecimal = 5M;
    int times = (int) (testDecimal / 0.25M);
    Assert.AreEqual(20, times);
    

    另外,正如其他人所指出的,您可能需要考虑如何从十进制转换为int。您是希望使用默认行为(从简单的强制转换中获得的内容),还是希望向上取整、向下取整、向偶数取整等?在这种情况下,由于除法产生一个积分结果,这无关紧要,但在一般情况下,您需要对其进行一些思考。

    顺便说一下,这段代码中出现错误的原因是:

    int times = (int) testDecimal / Convert.ToDecimal(0.250); 
    

    将testdecimal(5.0米)转换为int(5)。然后除以一个小数(0.25米),得到一个小数(20.0米)。最后,尝试将该十进制数赋给整数,编译器会发出错误信号。

    高温高压

    推荐文章