JAVA中如何对double或者float的浮点数进行精度计算
2011-06-16 15:56
218 查看
本篇介绍了在JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:
Java代码
package
com.soft4j.utility;
import
java.math.BigDecimal;
public
final
class
RoundTool {
public
static
double
round(
double
value,
int
scale,
int
roundingMode) {
BigDecimal bd =
new
BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double
d = bd.doubleValue();
bd =
null
;
return
d;
}
public
static
void
main(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
}
}
《Double精度的常用设置》
http://henry406.javaeye.com/blog/459669
import java.text.DecimalFormat;
import java.math.BigDecimal;
public class Test_Double{
public static void main(String[]
args){
//-----方法1--------四舍五入
round对负数是五舍六入
double d_1 =
123.9;
System.out.println("d_1 =
"+Math.round(d_1));
//-------方法2------------------
DecimalFormat decfmt = new
DecimalFormat("##0.00");
System.out.println(decfmt.format(1.33482222));
//--------方法3--------------
double x = 1.33345;
java.text.NumberFormat formate =
java.text.NumberFormat.getNumberInstance();
formate.setMaximumFractionDigits(3);//设定小数最大为数,那么显示的最后会四舍五入的
String m =
formate.format(x);
System.out.println(m);
//--------方法4--------------
BigDecimal bd = new
BigDecimal(1.234543);
bd =
bd.setScale(3,BigDecimal.ROUND_HALF_EVEN);
double d = bd.doubleValue();
System.out.println(d);
//--------取消科学计数法-------------
Double dValue =
Double.valueOf("276363652844.8477474");
System.out.println(dValue);
BigDecimal
original = new
BigDecimal(dValue.doubleValue());
BigDecimal result = original.setScale(2,
BigDecimal.ROUND_HALF_DOWN);
String test
= result.toString();
System.out.println(test);
}
}
《
Java Double
精度问题总结
》
http://zhaow-381002134.javaeye.com/blog/420369
使用Java,double
进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
所以一般对double类型进行运算时,做好对结果进行处理,然后拿这个值去做其他事情。
目前总结如下:
public
static double round(double value, int
scale,
int roundingMode) {
BigDecimal bd = new
BigDecimal(value);
bd
= bd.setScale(scale,
roundingMode);
double
d = bd.doubleValue();
bd = null;
return
d;
}
public
double sum(double d1,double d2){
BigDecimal bd1 = new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}
public double sub(double
d1,double d2){
BigDecimal bd1 =
new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.subtract(bd2).doubleValue();
}
public double mul(double
d1,double d2){
BigDecimal bd1 =
new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.multiply(bd2).doubleValue();
}
public double div(double
d1,double d2,int scale){
//
当然在此之前,你要判断分母是否为0,
// 为0你可以根据实际需求做相应的处理
BigDecimal bd1 = new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return
bd1.divide
(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript
四舍五入的方法:
小数点问题
Math.round(totalAmount*100)/100 (保留 2 位)
function
formatFloat(src, pos)
{
return Math.round(src*Math.pow(10,
pos))/Math.pow(10, pos);
}
Java代码
package
com.soft4j.utility;
import
java.math.BigDecimal;
public
final
class
RoundTool {
public
static
double
round(
double
value,
int
scale,
int
roundingMode) {
BigDecimal bd =
new
BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double
d = bd.doubleValue();
bd =
null
;
return
d;
}
public
static
void
main(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
}
}
《Double精度的常用设置》
http://henry406.javaeye.com/blog/459669
import java.text.DecimalFormat;
import java.math.BigDecimal;
public class Test_Double{
public static void main(String[]
args){
//-----方法1--------四舍五入
round对负数是五舍六入
double d_1 =
123.9;
System.out.println("d_1 =
"+Math.round(d_1));
//-------方法2------------------
DecimalFormat decfmt = new
DecimalFormat("##0.00");
System.out.println(decfmt.format(1.33482222));
//--------方法3--------------
double x = 1.33345;
java.text.NumberFormat formate =
java.text.NumberFormat.getNumberInstance();
formate.setMaximumFractionDigits(3);//设定小数最大为数,那么显示的最后会四舍五入的
String m =
formate.format(x);
System.out.println(m);
//--------方法4--------------
BigDecimal bd = new
BigDecimal(1.234543);
bd =
bd.setScale(3,BigDecimal.ROUND_HALF_EVEN);
double d = bd.doubleValue();
System.out.println(d);
//--------取消科学计数法-------------
Double dValue =
Double.valueOf("276363652844.8477474");
System.out.println(dValue);
BigDecimal
original = new
BigDecimal(dValue.doubleValue());
BigDecimal result = original.setScale(2,
BigDecimal.ROUND_HALF_DOWN);
String test
= result.toString();
System.out.println(test);
}
}
《
Java Double
精度问题总结
》
http://zhaow-381002134.javaeye.com/blog/420369
使用Java,double
进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。
所以一般对double类型进行运算时,做好对结果进行处理,然后拿这个值去做其他事情。
目前总结如下:
public
static double round(double value, int
scale,
int roundingMode) {
BigDecimal bd = new
BigDecimal(value);
bd
= bd.setScale(scale,
roundingMode);
double
d = bd.doubleValue();
bd = null;
return
d;
}
public
double sum(double d1,double d2){
BigDecimal bd1 = new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}
public double sub(double
d1,double d2){
BigDecimal bd1 =
new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.subtract(bd2).doubleValue();
}
public double mul(double
d1,double d2){
BigDecimal bd1 =
new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return bd1.multiply(bd2).doubleValue();
}
public double div(double
d1,double d2,int scale){
//
当然在此之前,你要判断分母是否为0,
// 为0你可以根据实际需求做相应的处理
BigDecimal bd1 = new
BigDecimal(Double.toString(d1));
BigDecimal bd2 = new
BigDecimal(Double.toString(d2));
return
bd1.divide
(bd2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
这样,计算double类型的数据计算问题就可以处理了。
另外补充一下 JavaScript
四舍五入的方法:
小数点问题
Math.round(totalAmount*100)/100 (保留 2 位)
function
formatFloat(src, pos)
{
return Math.round(src*Math.pow(10,
pos))/Math.pow(10, pos);
}
相关文章推荐
- JAVA中如何对double或者float的浮点数进行精度计算
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- Java浮点数float和double精确计算的精度误差问题总结
- java用double和float进行小数计算精度不准确
- Java浮点数float和double精确计算的精度误差问题总结
- java用double和float进行小数计算精度不准确
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- 14、Java中用浮点型数据Float和Double进行精确计算时的精度问题
- Java浮点数float和double精确计算的精度误差问题总结
- java中float/double计算丢失精度解决方案
- JAVA对double或者 float的浮点数精度计算控制方法
- Java 浮点数 float和double类型的表示范围和精度
- java double float 精度计算
- Java中如何解决double和float精度不准的问题
- Java中如何解决double和float精度不准的问题
- JAVA对double或者float的浮点数精度计算控制方法
- JAVA对double或者float的浮点数精度计算控制方法