java,浮点数运算无法精确怎么办?

java,浮点数运算无法精确怎么办?,第1张

double表示浮点数时是有精度限制的,这跟double计算机内部的表示有关,任意一个double都要变成 尾码2^阶码,且1<=尾码<2,如 1452^5,145存储时只存小数点后面的数,045最后也变成2^b0+2^b1+2^bn,尾码存储时每一位就是b0,b1,bn,04无法精确表示的。

如果想使用无精度限制,那就只能使用BigDecimal

BigDecimal dec = new BigDecimal("12345678906"); //这个就是精确的12345678906
BigDecimal dec1 = new BigDecimal("100040");
BigDecimal dec2 = new BigDecimal("1000");
BigDecimal dec3 = dec1subtract(dec2);   //这个就是精确的04

import javautilArrays;
import javautilScanner;
public class PrintDouble
{
public static void main(String [] args){
double[] date = new double[10];

Scanner sc = new Scanner(Systemin);
for(int i = 0; i < 10; i++){
Systemoutprintln("请输入第" + (i+1) + "个数");
date[i] = scnextDouble();
}
Arrayssort(date);
for(int i = 0; i < 10; i++){
Systemoutprintln(date[i]);
}
}
}
自己手工写的请采纳

用BigDecimal类来计算,先用加法计算,再用结果除以1,通过devide除法方法来确认保留几位小数,如下例:

import javamath;
public class Demo
{
    public static void main(String[] args){
    BigDecimal big1 = new BigDecimal(12345623456);
    BigDecimal big2 = new BigDecimal(123456);
BigDecimal big3 = new BigDecimal(1);
BigDecimal temp = big1add(big2);
    Systemoutprintln(big1divide(big3,5,BigDecimalROUND_HALF_UP));//保留5位小数,返回bigDecimal
}
}

/
提供精确的小数位四舍五入处理。
@param v 需要四舍五入的数字
@param scale 小数点后保留几位
@return 四舍五入后的结果
/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(DoubletoString(v));
BigDecimal one = new BigDecimal("1");
return bdivide(one, scale, BigDecimalROUND_HALF_UP)doubleValue();
}

///改2个地方就OK了,就是以浮点数接受输入
import javautil;
public class xuexi{
public static void main ( String [] args ){
double number1,number2,sun;
sun = 0;
Systemoutprintln("请输入你的工作总时间");
Scanner shijian = new Scanner ( Systemin );
//////这里改
number1 = shijiannextDouble();
Systemoutprintln("请输入你一个钟的工资");
Scanner gongzi = new Scanner ( Systemin );
/////这里改
number2 = gongzinextDouble();
//工资是10元一个钟,时间是一天8小时,加班工资是3倍。
if( number1 > 8 ){
sun = number2 8 + number2 3 (number1 - 8);
Systemoutprintln("你的工资是" + sun);
}
else if ( number1 == 8 ){
sun = number2 8;
Systemoutprintln("你的工资是" + sun);
}
else{
sun = number1 number2;
Systemoutprintln ( "你的工资是" + sun );
}
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13374604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存