1

我正在尝试使用以下方法减去 C# 中的百分比:

n = n - (n * 0.25);

但我收到一个错误:

“不能隐式地'加倍'到'int'。存在显式转换(您是否缺少演员表?)”

4

10 回答 10

3

你的价值n是一个int

当您乘以0.25( 这是 a double) 时,结果值是double您尝试分配给 a 的 a int

要解决它,您必须指定您知道使用“显式转换”会丢失精度。

n = n - (int)(n * 0.25);

(Type)value被称为“投到valueType。这正是错误消息建议您执行的操作。

或者,如果您不想保持精度,请不要声明n为 anint而是声明为double. 在这种情况下,您不必强制n * 0.25转换为int.

于 2013-01-30T11:30:44.170 回答
2

如果您不想在 int 和 double 类型之间来回切换,您可以使用:

n = (n * 75) / 100

如果您的答案曾经有小数,但它们会丢失

于 2013-01-30T12:04:07.530 回答
0

我想这可能是 n 类型的问题,因为int它最不需要是double

因此,当您得到n = n - (n * 0.25)结果时,结果是双倍的

如果您想将其转换为 int 则请注意舍入,因为它并不总是以.00

我也认为这会更好n = n * 0.75

于 2013-01-30T11:39:05.257 回答
0

您的变量n必须是整数,但您的计算结果是双精度数,因为它涉及乘以双精度数 ( 0.25)。

您可以将结果转换回 int,如下所示:

n = (int)(n - (n * 0.25));
于 2013-01-30T11:31:29.627 回答
0

我假设那n是一个整数类型,比如说int,因为你没有给出任何线索。在这种情况下,最简单的解决方案是:

n = Convert.ToInt32(n - (n * 0.25));

或者你可以投射:

n = (int)(n - (n * 0.25));
于 2013-01-30T11:31:39.843 回答
0

检查变量“n”的类型。

'n' 应该是双精度类型。

或者

使用显式强制转换转换为 int。

int n = (int)(n - (n * 0.25));
于 2013-01-30T11:31:40.330 回答
0

你的n变量是一个int. 当您尝试使用多个 with 时0.250.25double,所以结果将是double。您应该手动转换它,因为没有Implicit Numeric Conversionfor doubleto int。你必须Explicit Numeric Conversion为他们使用。

From --> To

double --> sbyte , byte, short, ushort, int, uint, long, ulong, char, float, or decimal

您应该将正确的表达式转换为int.

int n = 100;
n = (int) (n - (n * 0.25));
Console.WriteLine(n);

这是一个DEMO.

记住;

  • 显式数字转换可能会导致精度损失。
  • 当您从一个double值转换为整数类型时,该值将被截断。如果生成的整数值超出目标值的范围,则结果取决于溢出检查上下文。
于 2013-01-30T11:33:04.837 回答
0

您必须将结果转换为 int

n=(int)(n-(n*0.25));
于 2013-01-30T11:33:20.373 回答
0

最好的方法是做

 n = n - n/4;

如果您希望百分比是 0 到 100 之间的整数,否则您应该通过替换为na来声明。建议的分配不会发生代价高昂的转换。请注意,它是一个整数,因为两个操作数 (和) 都是整数,不会导致提升,因此使用整数除法。doubleint ndouble nn/4n4

解释

这是类型提升,n乘以 a doublen*0.25自动提升为 a double。原始人只能升职,不能降职。如果一个原语可以保存所有的值而不会导致精度损失,则它x的等级高于另一个原语。A可以保存整数的所有值,但例如,整数可以不保存。所以你正在努力提升和降级。有关详细信息,请参阅MSDN 库yydouble0.1

注意:从 adouble转换为 anint会导致值被截断,即“点”之后的所有小数都将被删除,因此-2.5变为-21.5变为1。上面使用的整数除法也四舍五入为零,使此分配与您的分配相等。但避免任何昂贵的转换。

于 2013-01-30T12:29:18.200 回答
0

尝试:

n = n - (int)((double)n * 0.25);

注意:通过这样做,您不会在 n 结果中的点后面有数字。

于 2013-01-30T11:34:22.170 回答