Java中如何乘法长和浮点
我需要将两个数字相乘(例如,A和B)并返回结果(A*B) 条件: 数字A:介于0到之间的任意数字。最大值(即0.11Java中如何乘法长和浮点,java,Java,我需要将两个数字相乘(例如,A和B)并返回结果(A*B) 条件: 数字A:介于0到之间的任意数字。最大值(即0.11 如果x B=10.9=>11的结果 如果x B>的结果=LONG_MAX,则返回LONG_MAX(即9223372036854775807) 我写了一个简单的函数,但它给了我奇怪的结果!!你能纠正我为什么函数失败吗 static long multiply(long A, float B) { long result = (long) Math.ceil(A * B);
static long multiply(long A, float B)
{
long result = (long) Math.ceil(A * B);
return result;
}
public static void main(String args[])
{
System.out.println(multiply(10L, 1.11F)); // 10 x 1.11 => 11.1 => 12 [PASS]
System.out.println(multiply(10L, 1.17F)); //10 x 1.17 => 11.7 => 12 [PASS]
System.out.println(multiply(Long.MAX_VALUE, 1.11F)); // 9223372036854775807 x 1.11 => 9223372036854775807 [PASS]
System.out.println(multiply(9999999L, 9.9999F)); // 9999999 x 9.9999 => 99,998,990.0001 => 99,998,991 [FAIL]
// I am getting 99998992, instead of 99998991 !!
System.out.println(multiply(4611686018427387908L, 1.0F)); // 4611686018427387908L x 1 => 4611686018427387908 [FAIL]
// I am getting 4611686018427387904 instead of 4611686018427387908
System.out.println(multiply(96113850L, 1.0F)); // 96113850 x 1 => 96113850 [FAIL]
// I am getting 96113848 instead of 96113850
}
最后3个测试用例失败。请告诉我如何更正它
谢谢。使用BigDecimal以几乎无限范围的十进制数制进行计算和四舍五入:
static long multiply(long A, float B)
{
return new BigDecimal(A)
.multiply(new BigDecimal(B))
.max(new BigDecimal(Long.MAX_VALUE)
.setScale(0, RoundingMode.UP)
.longValue();
}
使用BigDecimal在几乎无限范围的十进制数字系统中进行计算和四舍五入:
static long multiply(long A, float B)
{
return new BigDecimal(A)
.multiply(new BigDecimal(B))
.max(new BigDecimal(Long.MAX_VALUE)
.setScale(0, RoundingMode.UP)
.longValue();
}
首先,如果“B”是一个小数位数最多为10位的十进制数,那么它需要是一个双精度
,而不是浮点数
为了防止计算过程中的精度损失,需要使用BigDecimal
静态长乘法(长a,双b){
if(a<0 | | b<0)
抛出新的IllegalArgumentException(“不允许负值”);
BigDecimal结果=BigDecimal.valueOf(a)
.multiply(BigDecimal.valueOf(b))
.setScale(0,舍入模式向上);
返回(result.compareTo(BigDecimal.valueOf(Long.MAX_VALUE))<0
?result.longValue():Long.MAX_值);
}
试验
System.out.println(乘法(10L,1.11));//12
System.out.println(乘法(10L,1.17));//12
System.out.println(乘法(Long.MAX_值,1.11));//9223372036854775807
System.out.println(乘法(9999999L,9.9999));//9998991
System.out.println(乘法(4611686018427387908L,1.0));//4611686018427387908
System.out.println(乘法(96113850L,1.0));//96113850
首先,如果“'B'将是一个小数点后最多10位的十进制数”,那么它需要是一个双精度的
,而不是浮点数
为了防止计算过程中的精度损失,需要使用BigDecimal
静态长乘法(长a,双b){
if(a<0 | | b<0)
抛出新的IllegalArgumentException(“不允许负值”);
BigDecimal结果=BigDecimal.valueOf(a)
.multiply(BigDecimal.valueOf(b))
.setScale(0,舍入模式向上);
返回(result.compareTo(BigDecimal.valueOf(Long.MAX_VALUE))<0
?result.longValue():Long.MAX_值);
}
试验
System.out.println(乘法(10L,1.11));//12
System.out.println(乘法(10L,1.17));//12
System.out.println(乘法(Long.MAX_值,1.11));//9223372036854775807
System.out.println(乘法(9999999L,9.9999));//9998991
System.out.println(乘法(4611686018427387908L,1.0));//4611686018427387908
System.out.println(乘法(96113850L,1.0));//96113850
你能用double而不是float吗?是的,我可以用double来表示数字“B”。float几乎从来都不是答案。double更精确。你可能必须使用BigDecimal。double不太精确,但更精确。float更精确,但不太准确。有一个关键的区别需要注意,值得花时间去理解它。@RichardBarkerdouble
有53位精度,float
只有24位精度,所以double
肯定比float
更精确。它也更精确。你能用double而不是float吗?是的,我可以用double来表示数字“B”。float几乎从来都不是答案。double更精确。你可以我们不必使用BigDecimal。Double不太精确,但更精确。float更精确,但不太精确。有一个关键的区别需要注意,值得花时间去理解它。@RichardBarkerDouble
有53位精度,float
只有24位精度,所以Double
肯定更精确ecise比float
更准确。谢谢@andreastank@Andreas