
BigDecimal:不可变的、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
BigDecimal 类提供以下 *** 作:算术、标度 *** 作、舍入、比较、哈希算法和格式转换
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (1234)、科学记数法表示的数 (123E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
两个类没有什么关系!
formatformat(abc);//返回的本来就是String
public Number parse(String text,
ParsePosition pos)分析字符串中的文本,以生成一个 Number。
该方法试图分析从 pos 所给定的索引处开始的文本。如果分析成功,则将 pos 的索引更新为所用最后一个字符后面的索引(不一定分析直到字符串末尾的所有字符),并返回分析后的数。可以使用更新后的 pos 指示下一次调用此方法的开始点。如果发生错误,则不更改 pos 的索引,并将 pos 的错误索引设置为发生错误处的字符索引,并且返回 null。
返回的子类取决于 isParseBigDecimal() 的值以及所分析的字符串。
如果 isParseBigDecimal() 为 false(默认值),则以 Long 对象返回多数整数值,而不管其写入方式如何:"17" 和 "17000" 都分析成 Long(17)。不符合 Long 的值则以 Double 的形式返回。这包括有小数部分的值、无穷大的值、NaN 和值 -00。DecimalFormat 不 根据源字符串中是否有小数分隔符来决定返回 Double 还是 Long 值。这样做会无法准确地分析导致某个 double 尾数(如 "-9,223,372,036,854,775,80800")溢出的整数。
调用方可能使用 Number 的方法 doubleValue、longValue 等来获得所需类型的数值。
如果 isParseBigDecimal() 为 true,则以 BigDecimal 对象的形式返回值。这些值是由 BigDecimalBigDecimal(String) 以和语言环境无关的格式为相应字符串所构造的那些值。特殊的情况是正负无穷大和 NaN 值,它们以 Double 实例的形式返回,其中保存了相应的 Double 常量值。
DecimalFormat 分析所有由 Characterdigit() 所定义的、表示小数数字的 Unicode 字符。另外,DecimalFormat 也将 DecimalFormatSymbols 对象中所定义的、从已本地化的阿拉伯数字 0 开始的 10 个连续字符识别为阿拉伯数字。
指定者:
类 NumberFormat 中的 parse
参数:
text - 要分析的字符串
pos - 具有索引和上述错误索引信息的 ParsePosition 对象。
返回:
分析得到的值,如果分析失败,则为 null
BigDecimal totalWeight = new BigDecimal(00);
// 销售产品表
for (SaleProduct saleProduct : saleProducts) {
// 产品
Product product = saleProductgetProduct();
// 产品配套
List<SaleProductPackage> saleProductPackages = saleProductgetSaleProductPackages();
// 产品配套公斤数
BigDecimal weight = new BigDecimal(00);
// 产品配套金额
BigDecimal price = new BigDecimal(00);
for (SaleProductPackage saleProductPackage : saleProductPackages) {
// 配套
PackagePackage packagePackage = saleProductPackagegetPackagePackage();
// 配套公斤数
weight = weightadd(packagePackagegetWeight());
// 配套金额
price = priceadd(packagePackagegetPrice());
}
// 产品配套总金额
BigDecimal totalPrice = new BigDecimal(saleProductgetNumber())multiply(price);
// 产品配套总公斤数
BigDecimal totalWeight_ = new BigDecimal(saleProductgetNumber())multiply(weight);
// 设置产品配套总公斤数
productsetPackageWeight(totalWeight_);
// 设置产品配套总金额
productsetPackagePrice(totalPrice);
// 设置产品总公斤数
productsetTotalWeight(productgetWeight()add(totalWeight_));
// 设置产品总金额
productsetTotalPrice(productgetPrice()add(totalPrice));
// 总公斤数
totalWeight = totalWeightadd(productgetTotalWeight());
// 修改产品
thisproductDaoupdate(product);
// 修改销售产品
thissaleProductDaoupdate(saleProduct);
}
// 修改订单总公斤数
ordersetTotalWeight(totalWeight);
// 修改订单
thisorderDaoupdate(order);
}
/
获取订单支付总金额
@param order 订单
@param saleProducts 销售产品集合
@return
/
private BigDecimal getTotalPrice(Order order, List<SaleProduct> saleProducts) {
// 订单支付总金额
BigDecimal totalPrice = new BigDecimal(00);
// 销售产品表
for (SaleProduct saleProduct : saleProducts) {
// 产品
Product product = saleProductgetProduct();
// 获取产品总金额
BigDecimal totalPrice_ = productgetTotalPrice();
// 总金额
totalPrice = totalPriceadd(totalPrice_);
}
// 运费
totalPrice = totalPriceadd(ordergetFreightPrice());
// 订单总金额
ordersetTotalPrice(totalPrice);
// 修改订单
thisorderDaoupdate(order);
return totalPrice;
}
/
创建订单
@param order 订单
@param saleProducts 销售产品集合
@return
/
private BigDecimal createOrder(Order order, List<SaleProduct> saleProducts) {
// 订单支付总金额
BigDecimal totalPrice = new BigDecimal(00);
// 销售产品表
for (SaleProduct saleProduct : saleProducts) {
// 产品
Product product = saleProductgetProduct();
// 获取产品总金额
BigDecimal totalPrice_ = productgetTotalPrice();
// 总金额
totalPrice = totalPriceadd(totalPrice_);
}
// 运费
totalPrice = totalPriceadd(ordergetFreightPrice());
// 订单总金额
ordersetTotalPrice(totalPrice);
// 创建订单
thisorderDaosave(order);
return totalPrice;
}
/
创建销售产品
@param order 订单
@param saleProducts 销售产品集合
/
private void createSaleProduct(Order order, List<SaleProduct> saleProducts) {
// 订单
String orderId = ordergetId();
// 销售产品表
for (SaleProduct saleProduct : saleProducts) {
// 产品
Product product = saleProductgetProduct();
// 产品配套
List<SaleProductPackage> saleProductPackages = saleProductgetSaleProductPackages();
// 产品配套公斤数
BigDecimal weight = new BigDecimal(00);
// 产品配套金额
BigDecimal price = new BigDecimal(00);
for (SaleProductPackage saleProductPackage : saleProductPackages) {
// 配套
PackagePackage packagePackage = saleProductPackagegetPackagePackage();
// 配套公斤数
weight = weightadd(packagePackagegetWeight());
// 配套金额
price = priceadd(packagePackagegetPrice());
// 订单
saleProductPackagesetOrderId(orderId);
// 保存销售产品配套
thissaleProductPackageDaosave(saleProductPackage);
}
// 产品配套总金额
BigDecimal totalPrice = new BigDecimal(saleProductgetNumber())multiply(price);
// 产品配套总公斤数
Big
利用反射获取类属性值,并依次判断属性值是否相同,不同返回true,代表已经发生变化
可以改变一下返回值,显示那个属性字段发生改变
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private long id;
private int age;
private BigDecimal sal;
private String name;
}
登录后复制

/
方法调用
@param args
/
public static void main(String[] args) {
Teacher teacher = Teacherbuilder()id(123L)age(25)sal(new BigDecimal(123))name("老师")build();
Teacher teacher1 = Teacherbuilder()id(1L)age(25)sal(new BigDecimal(123))name("老师1")build();
Systemoutprintln("教师信息-1:"+"\n"+teacher);
Systemoutprintln("教师信息-2:"+"\n"+teacher1);
//id不需要比对
Systemoutprintln(checkData(teacher,teacher1, ArraysasList("id")) "数据变化" :"数据未变化");
}
登录后复制

比对方法
/
判断属性值是否发生变化
@param class1 新数据
@param class2 历史数据
@param filterFields 不需要比对的字段
@return boolean 有变化返回true
/
private static <T> Boolean checkData(T class1, T class2, List<String> filterFields) {
//判断是否为同类
if(class1getClass() != class2getClass()){
throw new ClassCastException("数据类型不一致");
}
//获取所有类字段
Field[] fields = ReflectUtilgetFields(class1getClass());
//过滤不需要比对的字段
List<Field> fieldList = Arraysstream(fields)filter(f->!filterFieldscontains(fgetName()))collect(CollectorstoList());
for (Field field : fieldList) {
fieldsetAccessible(true);
try {
//获取属性值
Object value1 = fieldget(class1);
Object value2 = fieldget(class2);
//class1属性值不为空,class2属性值为空
if (ObjectUtilisNotEmpty(value1) && ObjectUtilisEmpty(value2)){
return true;
}
//class1属性值为空,class2属性值不为空
if (ObjectUtilisEmpty(value1) && ObjectUtilisNotEmpty(value2)){
return true;
}
//值不为空,属性值不等
if (ObjectUtilisNotEmpty(value1) && ObjectUtilisNotEmpty(value2)){
//对比属性值是否相同
if(!CompareValueEnumFiledType(value1,value2)){
return true;
}
}
} catch (Exception e) {
}
}
return false;
}
登录后复制

枚举类依据类型判断属性是否相同,相同返回true
/
比较属性值是否相同
@author shuai
@since 2022
@return Boolean 相同:true 不同:false
/
public enum CompareValueEnum {
Long(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Long v1 = (Long) var1;
Long v2 = (Long) var2;
if(ObjectUtilequals(v1,v2)){
return true;
}
return false;
}
},
Boolean(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Boolean v1 = (Boolean) var1;
Boolean v2 = (Boolean) var2;
if(ObjectUtilequals(v1,v2)){
return true;
}
return false;
}
},
Integer(){
@Override
public Boolean compareValue(Object var1, Object var2) {
Integer v1 = (Integer) var1;
Integer v2 = (Integer) var2;
if(ObjectUtilequals(v1,v2)){
return true;
}
return false;
}
},
BigDecimal(){
@Override
public Boolean compareValue(Object var1, Object var2) {
BigDecimal v1 = (BigDecimal) var1;
BigDecimal v2 = (BigDecimal) var2;
if(v1compareTo(v2) == 0){
return true;
}
return false;
}
},
String(){
@Override
public Boolean compareValue(Object var1, Object var2) {
String v1 = (String) var1;
String v2 = (String) var2;
if(ObjectUtilequals(v1,v2)){
return true;
}
return false;
}
};
public abstract Boolean compareValue(Object var1, Object var2);
/
对比属性值是否相同
@param var1 属性值1
@param var2 属性值2
@return Boolean 相同:true 不同:false
/
public static Boolean FiledType(Object var1, Object var2){
//获取字段类型
String type = var1getClass()getSimpleName();
for (CompareValueEnum code : CompareValueEnumvalues()){
if (typeequalsIgnoreCase(codename())){
if(!codecompareValue(var1,var2)){
return false;
}
break;
}
}
return null;
}
}
登录后复制

运行结果
教师信息-1:
Teacher(id=123, age=25, sal=123, name=老师)
教师信息-2:
Teacher(id=1, age=25, sal=123, name=老师1)
数据变化
id字段不在比对字段中,已过滤
教师信息-1:
Teacher(id=123, age=25, sal=123, name=老师)
教师信息-2:
Teacher(id=1, age=25, sal=123, name=老师)
数据未变化
int a = 1574444;
String aS = StringvalueOf(a);
char[] asC = aStoCharArray();
for(int i=0;i<asClength;i++){
Systemoutprintln(asC[i]);
}
打印出来的就是每一位数字
首先楼上那两位对于普通的使用场景来说基本是正确的。但是在一些需要精确结果的场景中(比如货币金额计算),double就会有问题了,比如:
(int)102399999999999999=1024;
再比如:
double n1=003;double n2=002;
double n3=n1-n2;
Systemoutprintln(n3);//0009999999999999998
所以如果需要精确安全的 *** 作的话,需要用到这个类:javamathBigDecimal
调用它的divideAndRemainder方法来进行计算,该计算可以理解为:进行一次保留余数的除法运算。结果会返回一个BigDecimal类型且长度为2的数组,0下标的元素是该计算的商,1下标的元素是该结果的余数。
BigDecimal n4=new BigDecimal("102399999999999999");BigDecimal [] result=n4divideAndRemainder(BigDecimalvalueOf(1));
Systemoutprintln(result[1]toString());//099999999999999
注意,构造BigDecimal对象的时候我使用的是字符串String类型的“102399999999999999
”,如果直接写102399999999999999的话会被认为是double类型的数,然后double类型的该值为10240,所以给字符串类型的值可以保证BigDecimal对象接收到的数就准确无误是我们心里想的数。
以上就是关于java中DecimalFormat abc=new DecimalFormat("0.00")全部的内容,包括:java中DecimalFormat abc=new DecimalFormat("0.00")、DecimalFormat String 保留2位、产品配套分配公斤数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)