Java Float 保留小数位精度的实现

目录
  • Float 保留小数位精度
  • Float 浮点型数据保留两位小数
    • 1、DecimalFormat
    • 2、Math.round():

Float 保留小数位精度

DecimalFormat decimalFormat=new DecimalFormat(".00");
return Float.valueOf(super.getDecimalFormat().format(new BigDecimal(handleTime)));

Float 浮点型数据保留两位小数

用过两种方法:DecimalFormat和Math.round()。

用法:

1、DecimalFormat

String java.text.NumberFormat.format(double number)方法

float f = 0.5555f;
DecimalFormat df1 = new DecimalFormat("#.00");//保留两位小数,如果是零点几,则小数点前的0不显示,小数点后几个零就保留几位
df1.format(f);
#表示该位如果是0则不必显示出来,0则表示该位如果是0仍然显示;

函数的定义是:;

所以,传参是double,也可以传float(隐式转换),最后的结果是String类型。

2、Math.round():

int java.lang.Math.round(float a)方法

float f = 1.222f;
f = Math.round(f * 100) / 100f;//乘以100,然后除以100转换为浮点类型
/**乘以多少就保留多少位小数
**注意Math.round()方法传float类型!
*/

两种方法都会四舍五入。

如果是浮点类型建议用Math.round方法,也可以根据自己需求diy代码。

详细讲解请看代码注释和控制台输出:(包含decimalFloat的格式、Math.round函数的实现逻辑)

package testMap;
import java.text.DecimalFormat;
public class TestFloat {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//四舍五入保留两位
		float f = 0.5555f;
		//decimalFormat是将double类型数据转换为字符串,并进行格式化
		//#表示这位如果是0则不必显示出来,0则表示这位如果是
		//format函数:String java.text.NumberFormat.format(double number)
		DecimalFormat df1 = new DecimalFormat("#.00");//首位0不显示出来,即0.1显示为  .1
		DecimalFormat df2 = new DecimalFormat("0.00");//首位0显示出来,即0.1显示为 0.1
		System.out.println("--------DecimalFormat----------");
		System.out.println("df1==" + df1.format(f));
		System.out.println("df2==" + df2.format(f));

		System.out.println(df1.format(f).getClass());//String类型
		System.out.println(Float.parseFloat(df1.format(f)));//转换为float类型
		System.out.println(String.valueOf(df1.format(f)));
//		System.out.println(Float.toString(df1.format(f)));//转换为String类型

		f = 0.595f;
		//Math.round()方法是将浮点类型数据 乘以10的多少次方 ,取整,然后 + 0.5 除以10的多少次方,取小数点后多少位
//		如乘以1000 则取小数点后3位
		System.out.println("---------Math.round()----------");
		System.out.println(Math.round(f * 100) / 100f);//四舍五入后如果末尾是0,自动省略,不显示

//		System.out.println(df1.format("1.2"));//参数必须是数值型String java.text.NumberFormat.format(double number)
		System.out.println(Float.toString(f));//转换为String输出效果
		System.out.println(Float.toString(f));//转换为String输出效果

		System.out.println("-----------Math.round()的正数非特殊值实现逻辑--------------");
		f = 11.115111f;
		int b = (int) (f * 100 + 0.5);
		float a = b / 100f;
		System.out.println("a==" + a);
		System.out.println((int)(f * 100 + 0.5) / 100f);

		f = -12.115f;
		System.out.println("负数" + Math.round(f * 100) / 100f);
		f = -12.116f;
		System.out.println("负数" + Math.round(f * 100) / 100f);		

		System.out.println("-------Math.round()的负数非特殊值实现逻辑--------");
		int c = (int) (f * 100 - 0.5);
		float d = c / 100f;
		System.out.println("d==" + d);
		System.out.println((int)(d * 100 - 0.5) / 100f);
	}
}

控制台输出:

截图如下:

----下面的是控制台输出-----(和上面一样的,怕图片丢失)

--------DecimalFormat----------
df1==.56
df2==0.56
class java.lang.String
0.56
.56
---------Math.round()----------
0.6
0.595
0.595
-----------Math.round()的正数非特殊值实现逻辑--------------
a==11.12
11.12
负数-12.11
负数-12.12
-------Math.round()的负数非特殊值实现逻辑--------
d==-12.12
-12.12

顺便贴上NumberFormat.formart()的代码:

/**
     * Specialization of format.
     *
     * @param number the double number to format
     * @return the formatted String
     * @exception        ArithmeticException if rounding is needed with rounding
     *                   mode being set to RoundingMode.UNNECESSARY
     * @see java.text.Format#format
     */
    public final String format(double number) {
        // Use fast-path for double result if that works
        String result = fastFormat(number);
        if (result != null)
            return result;

        return format(number, new StringBuffer(),
                      DontCareFieldPosition.INSTANCE).toString();
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中float类型的范围及其与十六进制的转换例子

    float占用4个字节,和int是一样,也就是32bit.       第1个bit表示符号,0表示正数,1表示负数,这个很好理解,不用多管.       第2-9个bit表示指数,一共8为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量.这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127.      剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性).   

  • 解决java数值范围以及float与double精度丢失的问题

    1.java中int,float,long,double取值范围 public class TestOutOfBound { public static void main(String[] args) { System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE)); //内存溢出 System.out.println(Integer.MAX_VALUE); //2的31次方-1,10个数位,正的20亿左右,用在钱上面不一定够 Syste

  • 详解java中float与double的区别

    float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间 double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到10的308次方,double占用8个字节的存储空间 当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f 例如:float a=1.3; 则会提示不能将double转化成float  这成为窄型转化 如果要用float来修饰的话,则应该使用float a

  • java中用float时,数字后面加f,这样是为什么你知道吗

    目录 Java float 与 double 的区别 1.float是单精度浮点数 2.java中默认声明的小数是double类型的 3.对编程人员来而 Java float.double.long类型变量赋值添加f.d.L尾缀问题 1.添加尾缀说明 2.不添加尾缀也不会报错的情况 3.总结 Java float 与 double 的区别 1.float是单精度浮点数 内存分配4个字节,占32位,有效小数位6-7位 double是双精度浮点数,内存分配8个字节,占64位,有效小数位15位 2.j

  • 在java中判断两个浮点型(float)数据是否相等的案例

    示例代码: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; System.out.println("使用==判断是否相等:" + (a == b));// 超出精度范围 System.out.println("使用Math.abs()判断是否相等:" + (Math.abs(a - b) >= 0)); System.out.p

  • Java 字符串转float运算 float转字符串的方法

    需求:字符串(字符串只有一位小数)转float进行运算, 将结果转成字符串(保留一位小数) 直接上代码: float f1 = 0.1f; String a1 ="1.5"; System.out.println(Float.parseFloat(a1)+f1); 答案:1.6 float f1 = 0.1f; String a1 ="1.6"; System.out.println(Float.parseFloat(a1)+f1); 答案:1.7 说实话,一开始我

  • 关于Java float和double精度范围大小

    目录 Java float和double精度范围大小 一.小数的二进制转换(浮点数) 二.浮点数在计算机中的存储 三.指数位的偏移量与无符号表示 四.小结一下 float和double的范围到底是多少 Java float和double精度范围大小 要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的: 举个例子:78.375,是一个正小数.要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换: 一.小数的二进制转换(浮点数) 78.375的

  • Java NumberFormat格式化float类型的bug

    首先,这个NumberFormat这个类,可以格式化各种数字.你只要稍微设置一下,结果还是很理性的. 但是,他有那么一丢丢的bug,不知道你知道不? /** * 2.3F经过格式化,竟然变成2.99啦.what the fuck . * float类型的时候,值是2.3,但是一经变成Double,值就变成2.99999啦. * 这个format的参数是double类型的.所以,在传入参数的时候,就变成了对2.299999952316284进行操作.返回就过就是2.99 */ private st

  • Java Float 保留小数位精度的实现

    目录 Float 保留小数位精度 Float 浮点型数据保留两位小数 1.DecimalFormat 2.Math.round(): Float 保留小数位精度 DecimalFormat decimalFormat=new DecimalFormat(".00"); return Float.valueOf(super.getDecimalFormat().format(new BigDecimal(handleTime))); Float 浮点型数据保留两位小数 用过两种方法:De

  • Java Float 保留小数位精度的实现

    目录 Float 保留小数位精度 Float 浮点型数据保留两位小数 1.DecimalFormat 2.Math.round() Float 保留小数位精度 DecimalFormat decimalFormat=new DecimalFormat(".00"); return Float.valueOf(super.getDecimalFormat().format(new BigDecimal(handleTime))); Float 浮点型数据保留两位小数 用过两种方法:Dec

  • 关于Java float和double精度范围大小

    目录 Java float和double精度范围大小 一.小数的二进制转换(浮点数) 二.浮点数在计算机中的存储 三.指数位的偏移量与无符号表示 四.小结一下 float和double的范围到底是多少 总结一下上面的 Java float和double精度范围大小 要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的: 举个例子:78.375,是一个正小数.要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换: 一.小数的二进制转换(浮点数)

  • Java DecimalFormat 保留小数位及四舍五入的陷阱介绍

    目录 需求 代码实现 发现问题 RoundingMode.HALF_EVEN 错误的代码测试RoundingMode.HALF_EVEN 正确的代码测试RoundingMode.HALF_EVEN 结论 需求 业务需要导出的Excel的数字内容保留两位小数,并且四舍五入 代码实现 百度一圈所抄袭的代码 DecimalFormat dfScale2 = new DecimalFormat("###.##"); dfScale2.format(1.125D); 发现问题 导出数据很诡异.不

  • java精度计算代码 java指定精确小数位

    本文实例为大家分享了java指定精确小数位的具体代码,供大家参考,具体内容如下 java代码: public class App2 { public static void main(String[] args) { String val = checkNumber("10.1234155", 2, 6).toString(); System.out.println(val); } public static BigDecimal checkNumber(String number,

  • Java实现控制小数精度的方法

    生成double类型随机数 random()函数源码 /** * Creates a new random number generator. This constructor sets * the seed of the random number generator to a value very likely * to be distinct from any other invocation of this constructor. */ public Random() { this(s

  • Java序列化JSON丢失精度问题的解决方法(修复Long类型太长)

    目录 原因: 解决办法一: 解决办法(二): 总结 Java序列化JSON时long型数值,会出现精度丢失的问题. 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 解决办法一: 使用ToStringSerializer的注解,让系统序列化时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class) private Long createdBy; 上述方法需要在每个对象都配上该注

  • java 四舍五入保留小数的实现方法

    // 方式一: double f = 3.1516; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); // 方式二: new java.text.DecimalFormat("#.00").format(3.1415926); // #.00 表示两位小数 #.0000四位小数 以此类推- // 方式三: double d = 3.1

随机推荐