导航:首页 > 编程语言 > java精度计算

java精度计算

发布时间:2023-03-25 03:43:36

1. java 中float 、double的精度问题: float 、double取值范围是怎么样计算出来的

float和double都是遵循IEEE754标准的,内存单元里都是划分为三部分的:符号位 阶码 尾数。
其中
float的符号位占一位,阶码为8位,尾数为23位,所以一共四个字节;double的符号位占一位,阶码为11位,尾数52位。符号位为0的话说明是
正的,为1的话说明是负的;阶码就是尾数所要乘以的2的次方数;尾数默认是去掉整数位的1的,也就是说加入尾数序列为01010101(后面还有很多),
那么其实它是1.01010101(后面还有很多)。比如一个float类型的变量,其符号位为0,阶码化成十进制为3,尾数为01000000(后面都是0),那
么这个变量化为十进制的话就是1.25*(2^3)=10。
int类型占四个字节,但是它不是像float那样表示的和液,int除了符唤模物号位之外其他位都是表示数值的,没有表示阶码的,所以它的范围比float小很多。
下面是维基网络上的一点解释,可以码局参考一下。

http://zh.wikipedia.org/zh-cn/IEEE_754
不清楚的话还是先看看计算机原理的书或者追问,希望有帮助~

2. java 中 精度计算BigDecimal 是永远不会丢失精度的吗,小数点后面几位都不会

精度由BigDecimal对象在创建时设定的或默认的MathContext算术环境对象决定。
精度precision的十进制有效数字位数可以指定的。小数点后几位等按有效数位的规则。
精度为0时,代表无限位数的准确精度。此时遇到计算1/3输出的循环小数1.333333..会抛出算术异常,而不是返回有限的有效数字结果。

3. 怎么控制精度在java

JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:行春
转自http://stephen830.iteye.com/blog/260776

Java代码
/*
*Createdon2005-6-5
*Authorstephen
*Emailzhoujianqiang镇猛ATgmailDOTcom
*CopyRight(C)2005-2008,Allrightsreserved.
*/
packagecom.soft4j.utility;

importjava.math.BigDecimal;

/**
*与小数位精度(四舍五入等)相关的一些常用工具方法.
*
*float/double的精度取值方式分为以下几种:<br>
*java.math.BigDecimal.ROUND_UP<br>
*java.math.BigDecimal.ROUND_DOWN<br>
*java.math.BigDecimal.ROUND_CEILING<br>
*java.math.BigDecimal.ROUND_FLOOR<br>
*java.math.BigDecimal.ROUND_HALF_UP<br>
*java.math.BigDecimal.ROUND_HALF_DOWN<br>
*java.math.BigDecimal.ROUND_HALF_EVEN<br>
*
*@authorstephen
*@version1.0.0
*/
publicfinalclassRoundTool{

/**
*对double数据进行取精度.
*<p>
*Forexample:<br>
*doublevalue=100.345678;<br>
*doubleret=round(value,4,BigDecimal.ROUND_HALF_UP);<br>
*ret为100.3457<br>
*
*@paramvalue
*double数据.
*@paramscale
*精度位数(保留的小数位数).
*@paramroundingMode
*精度取值方式.
*@return精度计算后的数据.
*/
publicstaticdoubleround(doublevalue,intscale,introundingMode){
BigDecimalbd=newBigDecimal(value);
bd=bd.setScale(scale,roundingMode);
doubled=bd.doubleValue();
bd=null;
returnd;
}

/**
*测试用的main方法.
*
*@paramargc
*运行参数.
御带桥*/
publicstaticvoidmain(String[]argc){
//下面都以保留2位小数为例

//ROUND_UP
//只要第2位后面存在大于0的小数,则第2位就+1
System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35
System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35
//ROUND_DOWN
//与ROUND_UP相反
//直接舍弃第2位后面的所有小数
System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34
System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34
//ROUND_CEILING
//如果数字>0则和ROUND_UP作用一样
//如果数字<0则和ROUND_DOWN作用一样
System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35
System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34
//ROUND_FLOOR
//如果数字>0则和ROUND_DOWN作用一样
//如果数字<0则和ROUND_UP作用一样
System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34
System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35
//ROUND_HALF_UP[这种方法最常用]
//如果第3位数字>=5,则第2位数字+1
//备注:只看第3位数字的值,不会考虑第3位之后的小数的
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34
//ROUND_HALF_DOWN
//如果第3位数字>=5,则做ROUND_UP
//如果第3位数字<5,则做ROUND_DOWN
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34
//ROUND_HALF_EVEN
//如果第3位是偶数,则做ROUND_HALF_DOWN
//如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
}
}

如果要求精确控制位数,推荐使用BigDecimal,这是在JDK1.4版本之后推荐的一个处理精度的类。

4. java数值类型精度问题,求救高手,高手请进,瞎说的走开!

java中..直接书写整数..那梁档么他的类型是int..

直接书写小数他的类型是double..

java中..运算式结果的类型..是该运算式中..类型范围最大的..

比如..int + long结果就是long类型..因为long类型范围比int大..这样结果才不会损失精度..

你题目中..

7是int..3也是int..

所以7/3也是int..并且值橡租乱是2..因为7/3等于2点几..转成int就把小数切掉..所以是2..

所以
int i=7/3;//相当于是把2赋值给一个int类型的变量i
float f=7/3;//相当于是把2转换成float变成2.0赋值给一个float类型的变量f
double d=7/型肢3;//相当于是把2转换成double变成2.0赋值给一个double类型的变量d

明白了么..

所以要想达到你要的效果..

float f=7/3;
double d=7/3;
这两个里面就需要把7或者3转成float或者double再计算机..这样计算结果就是float或者double..就不会切掉小数了..

即改成
float f=7/3f;//java中float数据就是在数字后面加个f或者F表示这个数是float类型
double d=7/3.0;//直接加个.0就是double了..也可以(double)7/3..就是把7转成double再计算..

希望能帮到你..

5. JAVA 中除法后小数精度问题

你说的这个问题涉及到数字精度问题,在程序中,数字运算总是低精度的向高精度的自动转化。比如(int)/(float)就会得到你想要的小数数位,这是由数字在计算机中的运算方式决定的。如果你用3/5.0或者3.0/5,你就可以得到你想要的小数。
在计算机中,整型(int)和浮点(float,double)的表示形式各不相同,占用内存空间也不同,在运算时,为了得到正确的结果,就要进行对位,如果数据类型不一致,就要进行转化。在硬件层面上就是把占用内存少的整型向浮点转换,也就是为这个整型添加额外的字节参与运算,尽管这些字节中都是0,这是数字精度的问题。
现在是两个整形数,运算时,计算机认为不需要进行数据类型的转化,所以就得到你见到的结果。

6. java中的精度是什么意思

1.精度是指的各种数碰友据类型的位宽

byte 8 位
short 16 位
int 32 位
long 64 位
float 32 位
double 64 位
char 16 位
2.数据降级都会损失精度的,体现在各种数据类型能表示的范围不一样。举个例子,float 32 位,根据 IEEE 754 32位 标准,首位正负位,后面 8 位指数位,余下 23 位是小数位;
double 64 位,根据 IEEE 754 64位 标准,首位正负位,后面 11 位指数桥猛位,余下 52 位是小数位。
相比之下当然位数愈多精度愈高了,其他敏吵桥整数类型的精度就简单了,首位表示正负,所有的都表示数值,位数越高当然精度越高。

7. 关于java单精度与双精度的问题

单简悄铅精度和双精度的区别就是,双精度要比单精度所存储的位数要多,至于说3.14师双精度,是因为Java中,默认的小数都是double类型,也就算双精度的,如果要定义单精度的话,那就要在小数的后面加上一个f或者F,即 double d = 3.14; float f = 3.14f; 一定要注意后面有没有“f”运蠢和“F”啊,这个初学的时候,经常会考拦好到。楼上说的,是对,但是,他那样写,就一定会报错。记住,单精度的变量定义,一定要在值的后面加上标识。

8. java中整数型的精度是几位

就是把类似耐腊"1234"的字符串转换成整型?
string
str="1234";//截取的字符串数字
int
m=integer.parseint(str);//转换后的结果
试下昌罩滑,有疑闷链惑欢迎追问。

阅读全文

与java精度计算相关的资料

热点内容
为什么我的世界天空服务器进不去 浏览:262
钉钉直播后的视频如何线上加密 浏览:503
听主的命令 浏览:208
全民上云时代云服务器 浏览:519
iphone不创建id如何下载app 浏览:972
windowsphp扩展安装 浏览:93
emacslinux配置文件 浏览:379
python3在线教程 浏览:114
不小心删文件夹的文件 浏览:480
java获取手机IP 浏览:816
手机rar解压密码获取 浏览:344
程序员被辞退工资怎么处理 浏览:494
恋活的模型没加密 浏览:159
如何把安卓机的微信转移苹果 浏览:583
爬山算法相关题目 浏览:724
vc编程大全 浏览:118
excel表格单列数据加密 浏览:650
给同事的解压话语 浏览:994
linux关闭网卡命令行 浏览:456
史上最漂亮程序员 浏览:771