java中DecimalFormat abc=new DecimalFormat("0.00")

java中DecimalFormat abc=new DecimalFormat("0.00"),第1张

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位、产品配套分配公斤数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9737478.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存