【问题标题】:50.0 cast as int outputs 49?50.0 转换为 int 输出 49?
【发布时间】:2014-02-04 18:05:31
【问题描述】:

我有以下代码行:

int destHeight = (int)(sourceHeight * percent);

我在将图像裁剪为缩略图同时保持纵横比的过程的一部分中使用它。

问题概述如下:

percent = 0.08680555,

sourceHeight = 576,

计算结果为50.0,但是当分配给destHeight作为int时,它变为49

我该如何解决这个问题?

【问题讨论】:

  • 在我的计算器上是 49.9999968。或 49 转换为 int
  • 同意@Rob,0.08680555和576的乘积是49.9999968。您是如何确定结果为 50.0 的?
  • @chux Visual Studio。我在计算中设置了一个断点,显然sourceHeight * percent 产生了一个Single。这就是为什么它完全像50.0一样出来。
  • @kehrk 谢谢。建议VS不提供exact值,而是四舍五入的结果。在这种情况下,对于我们的目的来说有点太圆了。

标签: math casting int percentage


【解决方案1】:

真的不是50:

double percent = 0.08680555;
int sourceHeight = 576;

System.out.println(sourceHeight * percent);  // e.g. Java
49.9999968

转换为 int 会截断小数部分,留下 49。


您可以尝试使用某种round() 函数:

double percent = 0.08680555;
int sourceHeight = 576;

System.out.println(Math.round(sourceHeight * percent));
50

【讨论】:

  • 太棒了。谢谢你。
【解决方案2】:

您应该将您的数字四舍五入以解决问题:int destHeight = (int)(sourceHeight * percent + 0.5);

【讨论】:

  • @kehrk。并不真地。如果您有兴趣获得最接近的整数,则四舍五入是可行的方法。这只是floorround 之间的区别。
  • x < 0 时使用double x; ... int y = (int) (x + 0.5); 效果不佳。 y = (int) round(x); 没有这个限制。
  • 是的。但是,在调整图像大小时,数字几乎可以保证是正数,这确实节省了函数调用。
【解决方案3】:

转换为 int 将被截断。改用 Convert.ToInt32():

int destHeight = Convert.ToInt32(sourceHeight * percent);

【讨论】:

    【解决方案4】:

    arshajii 是正确的。当从浮点数(例如double)转换为整数时,小数点通常会被截断。 (在 Java 中,整数类型为 byteshortintlong。)要获得 50,您必须使用舍入函数。 Java 示例:

    double percent = 0.08680555;
    int sourceHeight = 576;
    int destHeight = (int) Math.round(sourceHeight * percent);
    System.out.println(destHeight);
    
    50
    

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2019-06-18
      • 1970-01-01
      相关资源
      最近更新 更多