除以两位小数并将结果强制转换为int

时间:2018-07-03 15:19:53

标签: c# casting

我正在尝试将除法结果转换为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 个答案:

答案 0 :(得分:3)

尝试一下:

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

在没有多余的括号的情况下,它将尝试仅将testDecimal转换为整数,然后尝试将int / decimal结果隐式转换为整数,这就是导致错误的原因。

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

答案 1 :(得分:3)

正如大家回答的那样,您必须添加括号以转换除法的结果,而不仅仅是尝试转换第一部分,然后在除法后得到错误。

我还想指出,不必使用Convert.ToDecimal来声明常量为十进制,可以使用C# suffixs来做到这一点:

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

答案 2 :(得分:1)

您必须转换整个除法结果。尝试像:

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));

答案 3 :(得分:0)

首先,您不需要转换为小数,只需执行EXEC sp_HelpText 'AnotherSchema.NameOfTrigger'

然后您就可以

CREATE TRIGGER [AnotherSchema].[NameOfTrigger] ON [AnotherSchema].[NameOfTable]

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

答案 4 :(得分:0)

如果要将数字文字视为十进制,请使用后缀mM。这样就无需使用Convert.ToDecimal

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

答案 5 :(得分:0)

首先,您应该在testDecimal声明中添加“ M”后缀,否则5.00是乱码而不是小数。

decimal testDecimal = 5.00M;

现在,您的编译器不知道您的除法结果是整数。即使您的定义可以转换为“ int”,对于他来说,由另一个分隔的十进制也是十进制而不是整数。您必须隐式转换它:

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

对我来说就像魅力。

答案 6 :(得分:0)

将表达式用括号括起来,以便可以将其转换:

line_number[x1] = line_number.get(x1, []) + [f"{log_year}:{log_day}:{log_time}"]

请注意,由于并非所有// int times = (int)testDecimal / 0.250m; int times = (int)(testDecimal / 0.250m); 值都适合decimal,因此请确保在转换时尝试/捕捉。

int

答案 7 :(得分:0)

我不确定为什么要使用Convert.ToDecimal(0.250)。为什么在运行时将浮点数(0.250)转换为小数?为什么不只使用十进制文字(如0.25M)?正如其他人所指出的,您需要将除法结果转换为整数,例如:

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

此外,正如其他人所指出的那样,您可能需要仔细考虑如何进行从十进制到整数的转换。您是否要使用默认行为(从简单的转换中得到什么),还是要向上舍入,向下舍入,舍入到偶数等等?在这种情况下,由于除法会产生积分结果,所以没关系,但是在一般情况下,您需要考虑一下。

顺便说一下,您在此代码中有错误的原因:

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

是您将testDecimal(5.0M)转换为int(5)。然后,将其除以十进制(0.25M),得出十进制(20.0M)。最后,您尝试将小数赋给整数,然后编译器发出错误信号。

HTH