如何在JAVA中将两个int合并为一个double?

如果我有:

int a = 123; int b = 456; 

如何得到?:

 double c = 123.456; 

这个怎么样:

 int a = 123; int b = 456; double c = Double.parseDouble(a + "." + b); 

数学解决方案

  int a = 123; int b = 456; double c = a + (b == 0 ? 0 : b / Math.pow(10, 1 + (int) Math.log10(b))); 

说明:

  1 + (int) Math.log10(b) // number of digits (3 in case of 123) Math.pow(10, 1 + ... ) // 10...0 - 1 with required number of zeroes 

从每个integer创建字符串,然后将字符串连接在一起,插入“。” 两者之间。 然后将结果string转换为double

如果你想采用纯粹的计算方法,而不是涉及在字符串和数字forms之间来回转换,那么你可以这样做:

 double concatToDouble(int integer, int fraction) { if (fraction < 0) { throw new NumberFormatException("The fractional part must not be negative"); } else if (fraction == 0) { return integer; } else { int numFractionDigits = (int) Math.log10(fraction) + 1; int scaleFactor = (int) (Math.pow(10, numFractionDigits) + 0.1); return (double) ((long) integer * scaleFactor + (long) Math.signum(integer) * fraction) / scaleFactor; } } 

表达时间要长一些,但它会表现得更好,因为它涉及的工作量少于字符串格式的转换次数。

计算笔记:

  • 按比例放大整数部分,执行整数加法,然后按比例缩小总和将获得最接近你想要的double结果,但是
  • 在许多情况下, double没有您想要形成的十进制数的精确表示。
  • 我仔细而有意地选择了类型。 特别是,在计算缩放值之前,我将integer数值转换为long类型,以避免溢出。
  • 对于大于0的参数, Math.signum()返回1.0;对于小于零的参数, Math.signum()返回-1.0。 这允许该方法优雅地处理integer负值。
  • 在将结果截断为整数之前,我将Math.pow()的结果加0.1,以防pow()的结果pow()不一定是精确的)略小于精确结果。

但请注意,问题本身似乎并不能解释(无限多的)无关紧要的前导零,这些前导零在概念上位于小数部分的有效数字之前。 也就是说,如果没有指示分数部分的比例的第三个参数,则无法获得123.00456 等的结果

如果b的大小不是很简单,只需初始化一个新的包装器:

 new Double(a + ((double)b / 1000)) 

请注意,我在这里显式地将bdouble ,以便获得b / 1000double值而不是整数值。

如果整数的大小无关紧要,

 public class TestStackOverflowQuestion { public static void main(String[] args) { int a = 123; int b = 456; double c = a + Double.parseDouble("." + b); System.out.println(c); } }