去掉BigDecimal类型变量小数点后多余的零

       业务背景:mysql中A表中的B字段的类型是decimal类型,小数位数是三位,某一条数据的值是3000000,在Java中查询出来的结果是3000000.000,这样显示在页面中不太好看,用户希望看到是3000000。

      解决办法:使用 stripTrailingZeros().toPlainString()来解决。下面举例说明如何去掉BigDecimal类型变量小数点后多余的零:

BigDecimal testData = new BigDecimal("3000000.000");
System.out.println("直接转换成字符串后输出:" + testData.toString());
System.out.println("去掉尾部无用的零转并转换成字符串后输出:" + testData.stripTrailingZeros().toString());
System.out.println("只展示数值:" + testData.stripTrailingZeros().toPlainString());
System.out.println("工程计数法输出:" + testData.stripTrailingZeros().toEngineeringString());

测试结果:

直接转换成字符串后输出:3000000.00
去掉尾部无用的零转并转换成字符串后输出:3E+6
只展示数值:3000000
工程计数法输出:3E+6  

但是,如果将3000000.000改为3000000.700等,小数点后面有非零数字的场景,则stripTrailingZeros().toString()不会输出为科学计数法。

toString(),toPlainString(),toEngineeringString() 这三个方法都是用于将BigDecimal 转换成字符串,不同之处是toString()有可能会使用科学记数法,toPlainString()只展示数值,不使用科学记数法,toEngineeringString()工程计数法,与科学技术法类似,但要求10的幂必须是3的倍数。


toPlainString

toString

toEngineeringString

1000

1 * 10^3

1 * 10^3

10000

1 * 10^4

10 * 10^3

100000

1 * 10^5

100 * 10^3

1000000

1 * 10^6

1 * 10^6

但是,下面的方法不可以使用stripTrailingZeros()去除末尾无用的零,只能手动转换。

public static void main(String[] args) {
    BigDecimal ratio= new BigDecimal("0.00");
    System.out.println(ratio.stripTrailingZeros().toPlainString());
    // 自行判断,判断相等的时候,使用comparTo(),equals()不靠谱
    if (0 == BigDecimal.ZERO.compareTo(ratio)) {
        System.out.println("0");
     }
    if (!BigDecimal.ZERO.equals(ratio)) {
         System.out.println(" 居然不相等 ");
    }
} 

       总结:BigDecimal是处理高精度的浮点数运算的常用的一个类,当需要将BigDecimal中保存的浮点数值打印出来,特别是在页面上显示的时候,就有可能遇到意料之外的科学技术法表示的问题。stripTrailingZeros()可以去除小数点后多余的0,用科学记数法表示,再结合toPlainString()即可输出数值。

原文地址:https://www.cnblogs.com/east7/p/11708141.html

时间: 2024-11-09 02:49:40

去掉BigDecimal类型变量小数点后多余的零的相关文章

javascript 去掉小数末尾多余的零

做的项目里需要去掉 小数末尾的零 就自己随手写了一个 var t = "10203000"; alert(cutZero(t)); /* 去掉double类型小数点后面多余的0 参数:old 要处理的字符串或double 返回值:newStr 没有多余零的小数或字符串 例: cutZero(123.000) -> 123 cutZero(123.0001) -> 123.0001 cutZero(10203000.0101000) -> 10203000.0101 c

java正则去掉小数点后多余0

需求:已知字符串为一数字字符形式,多为float,double转换过来,将其后多余的0与.去掉. package test; /** * 去掉多余的.与0 * @author Hust * @Time 2011-11-7 */ public class TestString { public static void main(String[] args) { Float f = 1f; System.out.println(f.toString());//1.0 System.out.print

水晶报表动态显示小数点后的位数(去掉多余的0)

今天一来上班,有一个同事就问我如何控制显示数字小数点后面的位数, 如果有三位就显示三位,如果第三位数是0就显示2位小数,以此类推,小数点后如果都是0,就只显示整数. 默认的水晶报表数字字段会带有2或3位小数位,而当字段小数部分为零时,小数位将变成2或3个”0”(如123.000),很多时候我们不想要这几个多余的0,需要字段在有小数时显示小数位,没有小数时自动去掉多余的0.现以直接原料字段为例. 现在我想把直接原料字段动态显示小数位数即红色框框里的多余的0去掉. 此时选中"直接原料字段"

iOS 当请求到的数据是double类型,会失去精准度,并且去掉小数点后的0

首先请求到的数据都会变成字符串,先将字符串转化为double类型 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #ffffff } span.s1 { color: #de38a6 } span.s2 { } span.s3 { color: #00b1ff } double fdouble = [str doubleValue]: 然后再设置小数点后的位数 [NSString stringWithForma

去掉数字格式结尾多余的零,补充数字格式结尾需要的零

去掉数字格式结尾多余的零 JS: parseFloat(3.04000)=3.04 parseFloat(001.900)=1.9 C# (3.04000).ToString("0.##")=3.04 (001.900).ToString("0.##")=1.9 补充数字格式结尾需要的零 JS: toDecimal2(3)=3.00 C# (3.04).ToString("0.00000")=3.04000 (001.900).ToString(

mysql之处理金钱小数点后的多余0

问题产生原因:我们在做基金项目   产生大量的金钱  在GP首页展示首页信息的时候要求去除多余的0   由于我们在数据库设计的时候查询返回数据 例如18.100000 这种形式  而我们需要将多余的0去除掉  展现形式18.1这种形式展示 解决方案: 刚开始的时候我看见采用cast()函数  和 convert() 函数进行转换  真正的实现方式也是采用这两种函数 错误使用方式: 采用select cast(90.090008700 as decimal(9,3))  这种方式也可以去除小数点后

Java中double类型的数据精确到小数点后两位

Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585;BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 二: new java.text.DecimalFormat("#.00").format(3.1415926) 三: double d = 3.1415926

[Java]对double变量进行四舍五入,并保留小数点后位数

1.功能 将double类型变量进行四舍五入,并保留小数点后位数 2.代码 import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.NumberFormat; public class Test { /** * 保留两位小数,四舍五入 * @param d * @return */ public static double format

对数值数据的格式化处理(保留小数点后N位)

项目中有时会遇到对数值部分进行保留操作,列如保留小数点后2位,所有的数据都按这种格式处理, //保留小数点后2位,都按这种格式处理,没有补0 DecimalFormat df = new DecimalFormat("0.00"); //没有小数,或者小数部分不足是用0来补 BigDecimal db1 = new BigDecimal(111); System.out.println(df.format(db1)); //下面比较奇怪,不论是字符串表示,还是数字表示,只要没有大于11