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

java运算精度

发布时间:2023-07-13 16:14:57

java 中除法后小数精度问题

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

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

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

Ⅲ 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 位是小数位。
相比之下当然位数愈多精度愈高了,其他敏吵桥整数类型的精度就简单了,首位表示正负,所有的都表示数值,位数越高当然精度越高。

Ⅳ java能精确到小数点的后多少位

java中double类型是双精度浮点数,占用8字节(Byte)即64位(bit),其精度是由32个bit的二进制尾数来确定的,因此准确精度是二进制精度而不是十进制精度,通常可以保证十进制小数点后15位有效精度和第16位的部分精度。其实这个不只是java存在,是由计算机二级制架构决定的。高精度浮点计算,最好是先转换为整数计算后再转为小数。相对精度比较好。

Ⅳ java程序计算精度的问题。

的确使用普通的double/float都会发生精度的问题,所以你需要使用BigDecimal这个类,网络一下他的用法,专门用来处理精度问题的

Ⅵ 怎么控制精度在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版本之后推荐的一个处理精度的类。

Ⅶ java中如何实现N个浮点数相加并确保其精确度

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

importjava.math.*;
publicclassDemo
{
publicstaticvoidmain(String[]args){
BigDecimalbig1=newBigDecimal(123456.23456);
BigDecimalbig2=newBigDecimal(123.456);
BigDecimalbig3=newBigDecimal(1);
BigDecimaltemp=big1.add(big2);
System.out.println(big1.divide(big3,5,BigDecimal.ROUND_HALF_UP));//保留5位小数,返回bigDecimal
}
}
阅读全文

与java运算精度相关的资料

热点内容
ftp命令行查看文件数量 浏览:494
linux查看设备的命令 浏览:827
pythongolang学哪个 浏览:349
金蝶加密锁驱动下载 浏览:300
python编程基于自然语言处理库 浏览:133
javaseruntime 浏览:902
cad如何将命令放在鼠标旁边 浏览:746
程序员对粉色 浏览:125
编译器命令java 浏览:989
云服务器怎么数据同步 浏览:685
c盘文件修复命令语 浏览:966
文件夹中文件怎么上下移动 浏览:831
魅族手机用什么软件解压 浏览:763
加密币糖果 浏览:300
c编译调试是什么 浏览:631
安装mysql服务命令 浏览:734
程序员cpa考试 浏览:200
汕头买房用什么app好 浏览:23
民生原号码掉失如何登录app 浏览:710
如何设置服务器的重生点 浏览:272