java 四舍五入保留小数的几种方式

java 四舍五入保留小数的几种方式引用处:https://blog.csdn.net/u014704879/article/details/41479399/https://blog.csdn.net/shruber/article/details/78413706https://www.cnblogs.com/Dhouse/p/7776780.html方式一:BigDecimaldoubletpD=6.1…

大家好,又见面了,我是你们的朋友全栈君。

引用处:
https://blog.csdn.net/u014704879/article/details/41479399/
https://blog.csdn.net/shruber/article/details/78413706
https://www.cnblogs.com/Dhouse/p/7776780.html

方式一:BigDecimal
double tpD = 6.15365;
BigDecimal bigD = new BigDecimal(tpD);
double tpD2 = bigD .setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

结果:6.15

解释说明:

(new BigDecimal()).setScale()方法用于格式化小数点,有多种小数保留模式,如下:

BigDecimal bigD = new BigDecimal("3.14159");
bigD.setScale(1)表示保留一位小数,默认用四舍五入方式 
bigD.setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
bigD.setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
bigD.setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
bigD.setScale(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

对应的参数定义如下:
ROUND_CEILING 
Rounding mode to round towards positive infinity. 
向正无穷方向舍入 

ROUND_DOWN 
Rounding mode to round towards zero. 
向零方向舍入 

ROUND_FLOOR 
Rounding mode to round towards negative infinity. 
向负无穷方向舍入 

ROUND_HALF_DOWN 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 

ROUND_HALF_EVEN 
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN 


ROUND_HALF_UP 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 


ROUND_UNNECESSARY 
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 
计算结果是精确的,不需要舍入模式 


ROUND_UP 
Rounding mode to round away from zero. 
向远离0的方向舍入

PS:

1,对于BigDecimal的初始化赋值的方式有一下几种,但是推荐用字符串初始化的方式

1. BigDecimal num1 = new BigDecimal(6.285967);//这种写法不允许,会造成精度损失

2. BigDecimal num2 = new BigDecimal(2);//这种写法是可以的

3. BigDecimal num3 = new BigDecimal("6.285967");//一般都会这样写最好

方式二:Math.round()

Math.round(6.2634675 * 100) * 0.01d;

结果:6.26

解释说明:

Math.round(x) 返回对参数x四舍五入后所得的整数近似值,通过如下例子做说明

1、小数点后第一位=5
正数:Math.round(11.5)=12
负数:Math.round(-11.5)=-11

2、小数点后第一位<5
正数:Math.round(11.46)=11
负数:Math.round(-11.46)=-11

3、小数点后第一位>5
正数:Math.round(11.68)=12
负数:Math.round(-11.68)=-12

根据上面例子的运行结果,我们还可以按照如下方式总结更加容易记忆:

1、参数的小数点后第一位<5,运算结果为参数整数部分。
2、参数的小数点后第一位>5,运算结果为参数整数部分绝对值+1,符号(即正负)不变。
3、参数的小数点后第一位=5,正数运算结果为整数部分+1,负数运算结果为整数部分。

 

总结:大于五全部加,等于五正数加,小于五全不加。

Math.round 

  语法:
   Math.round(x);
  参数:
   x 为一数值。
  解释:
   方法。返回对参数x四舍五入后所得的整数近似值。


round
public static long round(double a)
返回最接近参数的 long。结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为long 类型。换句话说,结果等于以下表达式的值:
(long)Math.floor(a + 0.5d)
特殊情况如下:

如果参数为 NaN,那么结果为 0。
如果结果为负无穷大或任何小于等于 Long.MIN_VALUE 的值,那么结果等于Long.MIN_VALUE 的值。
如果参数为正无穷大或任何大于等于 Long.MAX_VALUE 的值,那么结果等于Long.MAX_VALUE 的值。
参数:
a - 舍入为 long 的浮点值。
返回:
舍入为最接近的 long 值的参数值。
round
public static int round(float a)
返回最接近参数的 int。结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为int 类型。换句话说,结果等于以下表达式的值:
(int)Math.floor(a + 0.5f)
特殊情况如下:

如果参数为 NaN,那么结果为 0。
如果结果为负无穷大或任何小于等于 Integer.MIN_VALUE 的值,那么结果等于Integer.MIN_VALUE 的值。
如果参数为正无穷大或任何大于等于 Integer.MAX_VALUE 的值,那么结果等于Integer.MAX_VALUE 的值。
参数:
a - 要舍入为整数的浮点值。
返回:
舍入为最接近的 int 值的参数值。
---------------------
4.3<4.4<4.5  so  
math.round(4.3)=4   
math.round(4.4)=4   
math.round(4.5)=5

-4.6<-4.5 <-4.4 so 
math.round(-4.6)=-5 
math.round(-4.5)=-4
math.round(-4.4)=-4

-4.51   |-4.50   -4.49

4.49  | 4.50  4.51


因为是负数,所以临界点都是在5的左侧,文字上的“四舍五入”,让人容易糊涂



四舍五入都是往右边计算:
-----(-5)-----(-4.6)(-4.5)(-4.4)-----(-4)----------(0)----------(4)-----(4.4)(4.5)(4.6)-----(5)-----
-----(-5)<---(-4.6)(-4.5)---------->(-4)----------(0)----------(4)<----------(4.5)(4.6)--->(5)-----
-------------------------------(-4.4)--->(-4)---------(0)-----------(4)<---(4.4)----------------------------
注意这些数字的位置关系,正数和负数并不是对称关系,Math.round()的运算时都是由左向右运算,所以:
4.5四舍五入应该是取大值为5,-4.5也一样,取大值为-4,因为-4>-4.5>-5

PS:

1,这里说下Math.floor(),其返回值表示小于或等于指定数字的最大整数的数字,如下:

Math.floor( 45.95); 
// 45 
Math.floor( 45.05); 
// 45 
Math.floor( 4 ); 
// 4 
Math.floor(-45.05); 
// -46 
Math.floor(-45.95); 
// -46

方式三:DecimalFormat

new java.text.DecimalFormat("#.00").format(6.1435829);

结果:6.14

解释说明:

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。它可以支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)这些内容的本地化与区域化,如下例子说明:

     DecimalFormat df1 = new DecimalFormat("###,###.0000");//使用系统默认的格式
     System.out.println(df1.format(111111123456.12));
 
     结果:111,111,123,456.1200
        
     Locale.setDefault(Locale.US);//指定区域格式 ,这里使用美国的格式
     DecimalFormat df2= new DecimalFormat();
     System.out.println(df2.format(111111123456.1200));

     结果:111,111,123,456.12
 
     Locale.setDefault(Locale.FRANCE);//指定区域格式,法国
     DecimalFormat df2= new DecimalFormat("###,###.0000");//使用区域格式前提下自定义改造
     System.out.println(df2.format(111111123456.12));
    
     结果:111 111 123 456,1200

//----------------------------also use applypattern------------------------------//
 
     DecimalFormat df3= new DecimalFormat();
     myformat3.applyPattern("##,###.000");
     System.out.println(df3.format(11112345.12363)); //这里有四舍五入

     结果:11,112,345.124
//-----------------控制指数输出-------------------------------------------------//
 
      DecimalFormat df4= new DecimalFormat();
      myformat4.applyPattern("0.000E0000");
      System.out.println(df4.format(10000));
      System.out.println(df4.format(12345678.345)); //这里有四舍五入

      结果:   1.000E0004     1.235E0007
              
//------------------百分数的输出-------------------------------------------//
 
      DecimalFormat df5= null;
      try{
         df5= (DecimalFormat)NumberFormat.getPercentInstance();
     }catch(ClassCastException e){
        throw e;
     }
     df5.applyPattern("00.0000%");
     System.out.println(df5.format(0.34567));
     System.out.println(df5.format(1.34567));     

     结果:34.5670%    134.5670% 

DecimalFormat 包含一组符号,对于各符号的含义解释如下:

0 一个数字 
# 一个数字,不包括 0 
. 小数的分隔符的占位符 
, 分组分隔符的占位符 
; 分隔格式。 
– 缺省负数前缀。 
% 乘以 100 和作为百分比显示 
? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 替十进制分隔符。 
X 前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。

PS:

1,DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此,你可以使用NumberFormat.getInstance 指定一个地区,然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用,但是你需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。
 

方式四:String.format()

/**
* %.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型
/
double tpD = 6.1435628;
String result = String.format("%.2f", tpD );

结果:6.14

解释说明:

详细看:JAVA字符串格式化-String.format()的使用

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143621.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • arp属于tcp/ip协议吗_tcp协议与ip协议的区别

    arp属于tcp/ip协议吗_tcp协议与ip协议的区别本文主要讲述了ARP协议的作用、ARP分组格式、ARP高速缓存、免费ARP和代理ARP。

  • docker 删除_Docker删除镜像和容器[通俗易懂]

    docker 删除_Docker删除镜像和容器[通俗易懂]当一个host中镜像和容器较多,需要重置时可选择删除其中部分或全部的镜像和容器。那么你就需要下面的操作了。1、删除容器1)首先需要停止所有的容器dockerstop$(dockerps-a-q)2)删除所有的容器(只删除单个时把后面的变量改为containerid即可)dockerrm$(dockerps-a-q)2、删除镜像1)查看host中的镜像dockeri…

  • latex打双引号“ “

    latex打双引号“ “latex中如果用英文输入模式的双引号键入,则输出的结果与我们预期的不符合,这并不是LaTeX的正确输入方式。”test”输出为:正确的输入方式为:引号左边输入两个反引号`,,引号右边输入两个单引号’。“test”输出为:…

  • 基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标[通俗易懂]

    基岩版服务器开启坐标显示,mc基岩版怎么看坐标 mc基岩版如何看坐标[通俗易懂]mc基岩版如何看坐标我的世界地图有XYZ3个坐标,通过XYZ来显示你所处地图的区域。X-显示你在地图上的东/西位置,正数表示东,负数表示西。Y-显示你在地图上的海拔高度,整数表示位于地面上,负数表示位于地面下。Z-显示你在地图上的南/北位置,正数表示南,负数表示北。坐标可以显示为*位置和相对位置。02当坐标用数字显示时,则是*坐标,显示为地图上的特定地点。比如,1256163是一…

  • grub引导界面_grub2引导

    grub引导界面_grub2引导添加Vista启动项至GrubforDOS:menu.lst中添加以下启动项.titleMicrosoftWindowsVistaroot(hd0,0)chainloader/bootmgr####EndDefaultOptions##title      Ubuntu8.10,kernel2.6.27-7-genericuuid      a48f2bb1-…

    2022年10月12日
  • Java中的队列[通俗易懂]

    Java中的队列[通俗易懂]目录参考Deque从初学者的角度,认真地学习Java中队列的使用和设计。参考javadocDeque一个支持两端插入和删除的线性集合,此接口支持容量受限和不受限的双端队列(大多数实现容量不受限)。该接口定义了访问两端元素的方法,主要是插入、删除、检查元素方法。这些方法主要有两种形式,一种在操作失败时引发异常,一种在操作失败时返回特殊值(null或者false)。这里着重提一下插入操作,只有当队列容量受限时,插入操作才可能失败。12个方法如下该接口扩展了Queue接口。当双端队列

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号