bigdecimal

java金额转换

喜你入骨 提交于 2020-02-27 05:12:17
像商品价格,订单,结算都会涉及到一些金额的问题,为了避免精度丢失通常会做一些处理,常规的系统中金额一般精确到小数点后两位,也就是分; 这样数据库在设计的时候金额就直接存储整型数据类型,前端可以将金额X100以分为单位传给后端,后端进行一系列逻辑处理后要以元为单位返回前端直接展示, 这时候就可以定义一个简单的处理工具来转换: public class MoneyConvert<T> {  //分转换为元,返回string类型 public String centToDollarForString(T t){ if (t == null) { return "0"; } else { BigDecimal amount = getBigDecimal(t); amount = amount.divide(new BigDecimal(100)); return amount.toString(); } }  //分转换为元,返回double类型 public Double centToDollarForDouble(T t){ if (t == null) { return 0D; } else { BigDecimal amount = getBigDecimal(t); amount = amount.divide(new BigDecimal(100)); return

两个大整数相加减,数字比较长。

吃可爱长大的小学妹 提交于 2020-02-27 02:13:50
计算两个大整数相加减的结果,数字不是double类型能表示的,数字长度没有限制(最大127位)。 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平。 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性。 1、主函数 import java.math.BigDecimal; import java.util.Scanner; public class Tao_add { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i=10; while(i>1){ System.out.print("输入第一个数:"); String s1=sc.next(); System.out.print("输入加或减号:"); String s2=sc.next(); System.out.print("输入第二个数:"); String s3=sc.next(); String s4=send(s1,s2,s3); System.out.println("计算结果是:"+s4); System.out.println

正确运用BigDecimal

你说的曾经没有我的故事 提交于 2020-02-26 17:28:20
另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象,由刚才我们所罗列的API也可看出。 在一般开发过程中,我们数据库中存储的数据都是float和double类型的。在进行拿来拿去运算的时候还需要不断的转化,这样十分的不方便。这里我写了一个工具类: public class BigDecimalUtil { private BigDecimalUtil() { } public static BigDecimal add(double v1, double v2) {// v1 + v2 BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2); } public static BigDecimal sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2));

Java中常用的类

血红的双手。 提交于 2020-02-26 16:40:06
System、Math、BigDecimal import java.math.BigDecimal; import java.math.BigInteger; public class MathDemo { public static void main(String[] args) { double d = Math.abs(-9.9); System.out.println(d); d = Math.sin(Math.PI); System.out.println(d); // 浮点数的运算有精度问题,解决:BigDecimal类 System.out.println(0.09 + 0.01);// 0.09999999999999999 System.out.println(1.0 - 0.33);// 0.6699999999999999 System.out.println(0.0023 * 100);// 0.22999999999999998 System.out.println(12.3 / 100);// 0.12300000000000001 BigDecimal d1 = new BigDecimal("0.09");// 注意使用String类似构造,若使用double等构造仍然不精确 BigDecimal d2 = new BigDecimal("0

How to convert NumberDecimal to Double in MongoDB shell?

心不动则不痛 提交于 2020-02-25 08:22:29
问题 I have a document with "test" filed as NumberDecimal type { "_id" : ObjectId("5d1a202e476381c30cd995a4"), "test" : NumberDecimal("0.1") } How to convert "test" field from NumberDecimal to Double in mongodb shell? I tried execute db.collection.find({"test": {$exists: true}}).forEach(function (x) { x.test = parseFloat(x.test); db.collection.save(x); }); but don't solve this problem because it return NaN 回答1: The decimal type is not native to JavaScript, so NumberDecimal values in the shell are

java.math包下计算浮点数和整数的类

守給你的承諾、 提交于 2020-02-24 23:21:15
(1)BigIntege:实现任意精度的整数运算。 (2)BigDecimal:实现任意精度的浮点运算。 例如: 使用BigDecimal进行浮点数比较 import java.math.BigDecimal; public class HelloWorld{ public static void main(String[] args){ BigDecimal a=BigDecimal.valueOf(1.0); a=a.subtract(BigDecimal.valueOf(0.1)); //subtract:减去 a=a.subtract(BigDecimal.valueOf(0.1)); a=a.subtract(BigDecimal.valueOf(0.1)); a=a.subtract(BigDecimal.valueOf(0.1)); a=a.subtract(BigDecimal.valueOf(0.1)); System.out.println(a); //输出:0.5 System.out.println(1.0-0.1-0.1-0.1-0.1-0.1); //输出:0.5000000000000001 BigDecimal b=BigDecimal.valueOf(0.1); BigDecimal c=BigDecimal.valueOf(1.0/10.0);

Java 面向对象(七)

北城以北 提交于 2020-02-24 16:49:46
枚举 枚举的引入(模拟枚举) class Student { private int restDay; public int getRestDay() { return restDay; } public void setRestDay(int restDay) { this.restDay = restDay; } } public class Test { public static void main(String[] args) { Student stu = new Student(); stu.setRestDay(1); int res = stu.getRestDay(); if (res == 6 || res == 7) { System.out.println("放假"); } else { System.out.println("上课"); } } } 上面的代码,存在一些问题: (1)数据不安全,输入8 stu.setRestDay(8); // 输出:上课(没有星期八) (2)业务逻辑不合理:中外一周的第一天不一样,中国第一天是周一,外国第一天是周天。 改进后: class WeekDay { public static final int MONDAY = 1; public static final int TUESDAY = 2; public

Java-Class-C:java.util.BigDecimal

故事扮演 提交于 2020-02-22 15:57:57
ylbtech-Java-Class-C:java.util.BigDecimal 1. 返回顶部 2. 返回顶部 3. 返回顶部 4. 返回顶部 1、 /* * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * *//* * Portions Copyright IBM Corporation, 2001. All Rights Reserved. */package java.math;import java.util.Arrays;import static java.math.BigInteger.LONG_MASK;/** * Immutable, arbitrary-precision signed decimal numbers. A * {@code BigDecimal} consists of an arbitrary precision integer * <i>unscaled value</i> and a 32-bit integer <i

Java BigDecimal详解

我只是一个虾纸丫 提交于 2020-02-22 15:05:22
1.引言   float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。 先看下面代码 public static void main(String[] args) { System.out.println(0.2 + 0.1); System.out.println(0.3 - 0.1); System.out.println(0.2 * 0.1); System.out.println(0.3 / 0.1); } 运行结果如下  你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。   其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math

BigDecimal进行加减乘除计算

吃可爱长大的小学妹 提交于 2020-02-22 15:04:24
以前大部分关于查询计算的逻辑是在sql语句中执行的,但是有时候会出现比较复杂的计算情况,需要我们在代码中进行计算,这个时候使用BigDecimal进行计算会很方便。 BigDecimal num1 = new BigDecimal("10"); BigDecimal num2 = new BigDecimal("5"); BigDecimal num3 = null; //加法 num3 = num1.add(num2); System.out.println("num1+num2 = "+num3); //减法 num3 = num1.subtract(num2); System.out.println("num1-num2 = "+num3); //乘法 num3 = num1.multiply(num2); System.out.println("num1*num2 = "+num3); //除法 num3 = num1.divide(num2); System.out.println("num1/num2 = "+num3);    计算完之后可能会出现小数的情况,这种情况下需要在相应的加减乘除方法上进行变化,取2位小数且四舍五入的话可以直接在方法后加上 .setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal num1 =