java decimal

人气:139 ℃/2023-03-07 16:43:46

decimal类型在java是怎么用的呢?下面就让我们一起来了解一下吧:

decimal在java中一般是用BigDecimal来表示的,通常可用于计算、计费等,由于使用Double类型所造成的结果可能会与期望值有一些偏差,因此使用decimal类型进行计算会更好一些。

decimal在java中用BigDecimal表示时的示例代码如下:

@Column(length=10 ,scale=2) // length表示长度 , scale表示小数点后位数

private BigDecimal money;

当然,需要注意的是,使用BigDecimal多是用于操作运算加减乘除,示例代码介绍如下:

BigDecimal num1 = new BigDecimal("100");

BigDecimal num2 = new BigDecimal("50");

//加法

BigDecimal result1 = num1.add(num2);

//减法

BigDecimal result2 = num1.subtract(num2);

//乘法

BigDecimal result3 = num1.multiply(num2);

//除法

BigDecimal result4 = num1.divide(num2);

拓展:

BigDecimal类型与string,Double类型的相互转换是怎样的呢?

1、

若是将String类型转成BigDecimal类型,示例代码为:

BigDecimal bd = new BigDecimal("xxx");

String str = bd.toString();

2、

若是将double类型转化为BigDecimal,示例代码为:

Double a=1.23;

BigDecimal c = BigDecimal.valueOf(a);

但不能使用:

BigDecimal decimal= new BigDecimal(a);

3、

若是将BigDecimal类型转化为double,示例代码为:

BigDecimal bd;

double d = bd.doubleValue();

以上就是小编的分享了,希望能够帮助到大家。

java decimalformat

字符串、数字、日期格式化工具-Format

一听到Format,我觉得第一时间想来的是SimpleDateFormat,这个是最常用的,实际上,在Format这个抽象类下,有很多的实现工具,今天我们一起看一下。

Format结构

Format

所在包:java.text.Format

Format是一个抽象类,提供了两种方法:

public abstract StringBuffer format();public abstract Object parseObject ();

两个分别用来解析字符串和将字符串解析。

我们重点说format格式化成字符串

DateFormat

本身DateFormat是一个抽象类,我们并没有办法直接创建,但是我想大家对另外一个类肯定很熟悉,就是SimpleDateFormat,这个类可以让我们自定义格式化日期,实际上,它就是DateFormat的实现类。

但是DateFormat虽然不能实例化,但是它提供了实例化方法

Date date = new Date();DateFormat dateFormat = DateFormat.getDateInstance();System.out.println( dateFormat.format(date));//输出结果:2024-11-19DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);//输出结果:2024年11月19日 星期二DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);//输出结果:2024年11月19日DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.short);//输出结果:24-11-19//下面这个是默认参数,可以不填写DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);//输出结果:2024-11-19

Date date = new Date();DateFormat dateFormat = DateFormat.getTimeInstance();System.out.println(dateFormat.format(date));//输出结果:15:40:09DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.FULL);//下午03时41分34秒 CSTDateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.LONG);//下午03时41分52秒DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);//下午3:42//下面这个是默认参数,可以不填写DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);//15:50:12

接下来的getDateTimeInstance其实就是getDateInstance和getTimeInstance的组合,因此它提供了两个可选参数来控制date位和time位

Date date = new Date();DateFormat dateTimeInstance = DateFormat.getDateTimeInstance();System.out.println(dateTimeInstance.format(date));//输出结果:2024-11-19 12:15:13//这是默认输出,实际上,我们可以通过改变参数来输出一些个性化的内容//入参有两个,分别控制date部分和time部分DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);//输出结果:2024年11月19日 星期二 下午12时20分33秒 CSTDateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);//输出结果:2024年11月19日 下午12时22分38秒DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);//输出结果:24-11-19 下午12:23//下面这个是默认参数,可以不填写DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);//输出结果:2024-11-19 12:23:43

这个其实就是getDateTimeInstance

Date date = new Date();DateFormat dateFormat = DateFormat.getInstance();System.out.println(dateFormat.format(date));//输出结果:24-11-19 下午3:52

查看源代码:

NumerFormat

numberFormat本身也是一个抽象类,与DateFormat相似,NumberFormat也提供了通过getInstance的方式来获取实例

double num = 1220.0455121;NumberFormat integerInstance = NumberFormat.getIntegerInstance();System.out.println(integerInstance.format(num));//输出结果:1,220

double num = 1220.0455121;NumberFormat numberInstance = NumberFormat.getNumberInstance();System.out.println(numberInstance.format(num));//输出结果:1,220.046

double num = 1220.0455121;NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();//输出结果:¥1,220.05//我们可以更改地区来输出不同的结果NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.CANADA);//输出结果:$1,220.05

double num = 1220.0455121;NumberFormat percentInstance = NumberFormat.getPercentInstance();//输出结果:122,005%String a="11%";System.out.println(NumberFormat.getPercentInstance().parse(a));//输出结果:0.11DecimalFormat

它是NumberFormat的实现类,用于格式化十进制数字。它具有各种特性,可以解析和格式化数字,包括:西方数字、阿拉伯数字和印度数字。它还支持不同种类的数字,包括:整数(123)、小数(123.4)、科学记数法(1.23E4)、百分数(12%)和货币金额($123)。

在DecimalFormat构造器中,我们可以通过传入指定的参数,让DecimalFormat帮助我们将数字格式化成我们想要的样子

符号

释义

0

Digit代表一个数字

#

Digit。若是0就显示为空

.

小数/货币分隔符

-

减号

,

分组分隔符

E

科学计数法分隔符(位数和指数)

%

乘以100并显示为百分数

'

用于引用特殊字符。作用类似于转义字符

我们来说一下常用参数的用法

//输出指定的位数double num=2.332323;DecimalFormat decimalFormat = new DecimalFormat("0");System.out.println(decimalFormat.format(num));//输出结果:2DecimalFormat decimalFormat = new DecimalFormat("0.000000000");//输出结果:2.332323000

//与0相似,区别在于不会补充0double num=2.332323;DecimalFormat decimalFormat = new DecimalFormat("#");System.out.println(decimalFormat.format(num));//输出结果:2DecimalFormat DecimalFormat = new DecimalFormat("#.############");System.out.println(decimalFormat.format(num));//输出结果:2.332323

//从右到左,按指定位数分割,','左边出现参数无用double num=233232322;DecimalFormat decimalFormat = new DecimalFormat(",###");System.out.println(decimalFormat.format(num));//输出结果:233,232,322double num=233232322;DecimalFormat decimalFormat = new DecimalFormat("##,###");//输出结果:233,232,322//与上面无差别

double num=0.12;DecimalFormat decimalFormat = new DecimalFormat("##.00%");System.out.println(decimalFormat.format(num));//输出结果:12.00%double num=0.12;DecimalFormat decimalFormat = new DecimalFormat("##%");//输出结果:12%ChoiceFormat

它是NumberFormat的实现类,以double数组为键,String数组为值,通过double值获取指定的字符串,注意:两者必须长度一致,不然会报错。

double[] doubles={1,2,3,4,5,6,7};String[] strings={"周一","周二","周三","周四","周五","周六","周日"};ChoiceFormat choiceFormat = new ChoiceFormat(doubles,strings);System.out.println(choiceFormat.format(3));//参数位于3和4之间,取3System.out.println(choiceFormat.format(3.4));System.out.println(choiceFormat.format(3.6));//超过最大值,取最大的那个System.out.println(choiceFormat.format(8));//输出结果:周三//输出结果:周三//输出结果:周三//输出结果:周日MessageFormat

感觉这个是最常用的

基础用法:

//创建MessageFormat的方式MessageFormat messageFormat = new MessageFormat("小王是一个:{0},他今年:{1}岁了");System.out.println(messageFormat.format(new Object[]{"大帅比", 18}));//直接使用静态方法System.out.println(MessageFormat.format("小王是一个:{0},他今年:{1}岁了", "大帅比", 18));//输出结果:小王是一个:大帅比,他今年:18岁了//输出结果:小王是一个:大帅比,他今年:18岁了

在{}中,除了必要的下标之外,后面还支持FormatType和FormatStyle两位,这两位是非必需的。

{ ArgumentIndex , FormatType , FormatStyle }

MessageFormat messageFormat = new MessageFormat("小王是一个:{0},他今年:{1,number,##.#}岁了");System.out.println(messageFormat.format(new Object[]{"大帅比", 1.33234}));//输出结果:小王是一个:大帅比,他今年:1.3岁了

FormatType(只支持以下四种):

FormatStyle:

日期支持

时间支持

数字支持:

通过举例我们来发现规律:

MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date}", "大帅比", 18,new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024-11-20System.out.println(MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,full}", "大帅比", 18,new Date()));//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日 星期三MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,long}", "大帅比", 18,new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,long},现在是:{3,time}", "大帅比", 18,new Date(),new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日,现在是:9:46:53

在格式化date时,我们的第二个FormatType其实决定了使用哪个Format,date对应了DateFormat.getDateInstance,time对应来DateFormat.getTimeInstance;而第三个参数则是我们在使用DateFormat.getTimeInstance传入的参数,只不过当时是数字,现在是字符串。

MessageFormat.format("小王是一个:{0},他今年:{1,number,##}岁了", "大帅比", 18.32323)//输出结果:小王是一个:大帅比,他今年:18岁了MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了", "大帅比", 18.32323)//输出结果:小王是一个:大帅比,他今年:18.3岁了MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了,他已经活了人生的:{2,number,0%}", "大帅比", 18.32323,0.1)//输出结果:小王是一个:大帅比,他今年:18.3岁了,他已经活了人生的:10%MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了,他已经活了人生的:{2,number,0%},已经挣了:{3,number,currency}元", "大帅比", 18.32323,0.1,1000000)//输出结果:小王是一个:大帅比,他今年:18.3岁了,他已经活了人生的:10%,已经挣了:¥1,000,000.00元MessageFormat.format("{0,number,percent}", 0.255)//输出结果:26%

几个关键点:

//索引值必需从0开始,否则所有索引值均失效,参考下面MessageFormat.format("{1} - {1}", 1)//输出结果:{1} - {1}//实际传入的参数与索引个数不匹配,不会有问题MessageFormat.format("{0} - {1}", 1)//输出结果:1 - {1}MessageFormat.format("{0} - {1}", 1, 2, 3)//输出结果:1 - 2//使用一个'时会将{变成字符串,将不会被解析MessageFormat.format("'{0} - {1}",1, 2)//输出结果:{0} - {1}//使用两个'时会被解析MessageFormat.format("''{0} - {1}", 1, 2)//输出结果:'1 - 2MessageFormat.format("'{0}' - {1}", 1, 2)//输出结果:{0} - 2MessageFormat.format("''{0}'' - {1}", 1, 2)//输出结果:'1' - 2//缺少{时只会被当成普通字符串MessageFormat.format("0} - {1}", 1, 2))//输出结果:0} - 2//但是缺少}却会报错MessageFormat.format("{0 - {1}", 1, 2)//输出结果:Unmatched braces in the pattern

推荐

首页/电脑版/网名
© 2026 NiBaKu.Com All Rights Reserved.