java中数字加减乘除乱象(尤其是double类型)



做一个300 / 1570 的算数题,结果为0

是不是有点大跌眼镜

那怎么解决呢

转成Double类型,再除就没问题了

import java.math.BigDecimal;  

public class Arith {
private static final int DEF_DIV_SCALE = 10;  

/**
* * 两个Double数相加 *
*
* @param v1 *
* @param v2 *
* @return Double
*/
public static Double add(Double v1, Double v2) {
   BigDecimal b1 = new BigDecimal(v1.toString());
   BigDecimal b2 = new BigDecimal(v2.toString());
   return new Double(b1.add(b2).doubleValue());
}  

/**
* * 两个Double数相减 *
*
* @param v1 *
* @param v2 *
* @return Double
*/
public static Double sub(Double v1, Double v2) {
   BigDecimal b1 = new BigDecimal(v1.toString());
   BigDecimal b2 = new BigDecimal(v2.toString());
   return new Double(b1.subtract(b2).doubleValue());
}  

/**
* * 两个Double数相乘 *
*
* @param v1 *
* @param v2 *
* @return Double
*/
public static Double mul(Double v1, Double v2) {
   BigDecimal b1 = new BigDecimal(v1.toString());
   BigDecimal b2 = new BigDecimal(v2.toString());
   return new Double(b1.multiply(b2).doubleValue());
}  

/**
* * 两个Double数相除 *
*
* @param v1 *
* @param v2 *
* @return Double
*/
public static Double div(Double v1, Double v2) {
   BigDecimal b1 = new BigDecimal(v1.toString());
   BigDecimal b2 = new BigDecimal(v2.toString());
   return new Double(b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
     .doubleValue());
}  

/**
* * 两个Double数相除,并保留scale位小数 *
*
* @param v1 *
* @param v2 *
* @param scale *
* @return Double
*/
public static Double div(Double v1, Double v2, int scale) {
   if (scale < 0) {
    throw new IllegalArgumentException(
      "The scale must be a positive integer or zero");
   }
   BigDecimal b1 = new BigDecimal(v1.toString());
   BigDecimal b2 = new BigDecimal(v2.toString());
   return new Double(b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue());
}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 01:31:59

java中数字加减乘除乱象(尤其是double类型)的相关文章

原码,反码,补码,及Java中数字表示方法

原码:原码是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 如:如果是八位二进制1即用00000001表示,-1即用10000001表示. 反码:正数的反码就是其本身,负数的反码是在其原码的基础上,符号位不变,其他各个位取反. 补码:正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1). 利用原码计算:1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010

JAVA中数字证书的维护及生成方

Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息.证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥.  每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码.  在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码.这些信息包括 CN=xx,OU=xx,O=xx,L=xx,

Java中的StringBuffer、StringBuilder和包装器类型

1.如何使用StringBuffer类? 答:1).StringBuffer类用于表示可以修改的字符串,称为字符串缓冲对象: 2).使用运算符的字符串将自动创建字符串缓冲对象: 例:str1 + str2的操作,实际上把str1与str2都创建成StringBuffer类对象: 2.StringBuffer类的构造方法有哪些常用的重载方式? 答:StringBuffer()        创建一个空的StringBuffer对象,默认保留16个字符的缓冲空间 StringBuffer(Strin

java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进行运算和处理.float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal. BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是BigDeci

Java中数字操作

public static void main(String[] args) throws Exception { { //Math函数的四舍五入,注意负数的时候小数位<=0.5都会被舍去,>0.5的才会被进位 System.out.println(Math.round(15.5)); System.out.println(Math.round(-15.5)); System.out.println(Math.round(-15.51)); } { //用Random类生成随机数 List&l

java中yyyy-MM-dd HH:mm:ss类型转换成long类型

顺便总结一下今天遇到的坑: 1.html中的content是保留字不能用作id名 2.controller与jsp页面传输数据的时候,一定要注意变量以及变量类型的一致性. 3.一定要恶补js和jquery知识,没文化真可怕... 版权声明:本文为博主原创文章,转载请注明本博客地址!look to the master,follow the master,walk with the master,see through the master, become the master.

java中字符串与数字的互相转换

import java.text.DecimalFormat; /* * String类中本身提供方法可以将几乎所有的基本类型转换为String类型 * sysout alt+/ 可以直接显示System.out.println() */public class test { public static void main(String[] args) { // 数字转换为字符串 double d=12.25; String str=String.valueOf(d); System.out.p

java中封装类(二)

java中的数字类型包括 Byte,Short,Integer,Long,Float,Double.其中前四个是整数,后两个是浮点数. 在说java中数字类型之前先来看看它们统一的基类Number. package java.lang; public abstract class Number implements java.io.Serializable { public abstract int intValue(); public abstract long longValue(); pu

java 中包装类

java中八种基本数据类型对应的包装类型: 基本数据类型包装类型 bytejava.lang.Byte; shortjava.lang.Short; intjava.lang.Integer; longjava.lang.Long; floatjava.lang.Float; double      java.lang.Double; booleanjava.lang.Boolean; charjava.lang.Character; /* 以java.lang.Integer;类型为例,讲解八