Java의 float 부동 소수점 데이터는 소수점 이하 두 자리를 유지합니다.

DecimalFormat 및 Math.round()의 두 가지 방법이 사용되었습니다.

용법:

1、DecimalFormat: (String java.text.NumberFormat.format(double number)방법)

플로트 f = 0.5555f;

DecimalFormat df1 = new DecimalFormat(" #.00 "); //소수점 두 자리를 예약합니다. 소수점 몇 십분의 일이면 소수점 앞의 0은 표시되지 않고 소수점 뒤의 0은 예약됩니다.

df1.format(에프);

#비트가 0이면 표시할 필요가 없음을 나타내고 0은 비트가 0이면 여전히 표시됨을 의미합니다.

함수의 정의는 다음과 같습니다. ;

따라서 전달되는 매개변수는 double이고 float(암시적 변환)도 전달될 수 있으며 최종 결과는 String 유형입니다.

2、Math.round(): (int java.lang.Math.round(float a)방법)

플로트 f = 1.222f;

f = Math.round(f * 100 ) / 100 f; //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.format() 코드를 붙여넣습니다.

/**
     * 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();
    }

 

추천

출처blog.csdn.net/Rhine_danji_ys/article/details/103853919