【问题标题】:Subtract percentage in C#在 C# 中减去百分比
【发布时间】:2013-01-30 11:29:24
【问题描述】:

我正在尝试使用 C# 减去百分比:

n = n - (n * 0.25);

但我收到一个错误:

"不能隐式地将'double'转换为'int'。存在显式转换 (你错过了演员表吗?)”

【问题讨论】:

  • 百分比在哪里?
  • @Jon - 问题显然是“我做错了什么?”
  • 您是否期望 25% 的 int 始终是 int
  • @Ergwun:显然。但是明确说明它允许 OP 有机会自己推理它(橡皮鸭调试),也允许我们给出更相关的答案。我问不是为了变得迟钝。
  • 如果百分比始终为 25%,则选择 n = n - (n >> 2);将整数保存为浮点到整数转换:-)

标签: c# percentage subtraction


【解决方案1】:

您的值nint

当您乘以 0.25(即 double)时,结果值是您尝试分配给 intdouble

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

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

执行(Type)value 被称为“将value 转换为Type”。这正是错误消息建议您执行的操作。

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

【讨论】:

    【解决方案2】:

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

    n = (n * 75) / 100

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        或者你可以投射:

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

        【讨论】:

          【解决方案5】:

          检查变量“n”的类型。

          任何一个'n'都应该是双精度类型。

          或者

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

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

          【讨论】:

            【解决方案6】:

            您必须将结果转换为 int

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

            【讨论】:

              【解决方案7】:

              尝试:

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

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

              【讨论】:

                【解决方案8】:

                我想这可能是 n 类型为 int 的问题,它至少需要是 double

                因此,当您拥有 n = n - (n * 0.25) 时,结果是双精度

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

                结尾

                我也觉得这样会更好n = n * 0.75

                【讨论】:

                  【解决方案9】:

                  您的n 变量是int。当您尝试使用 0.25 进行多重运算时,0.25double,因此结果将是 double。您应该手动转换它,因为 doubleint 没有 Implicit Numeric Conversion。你必须为他们使用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 值转换为整数类型时,该值将被截断。如果生成的整数值超出目标值的范围,则结果取决于溢出检查上下文。

                  【讨论】:

                    【解决方案10】:

                    最好的办法就是这样做

                     n = n - n/4;
                    

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

                    说明

                    这是类型提升,n 乘以 double,这会将 n*0.25 自动提升为 double。原始人只能升职,不能降职。一个原语x 的等级高于另一个原语y,如果它可以保存y 的所有值而不会导致精度损失。 double 可以保存整数的所有值,但例如,整数不能保存0.1。所以你正在努力提升和降级。请参阅MSDN library 了解更多信息。

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-10-27
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-02-18
                      • 2018-09-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多