java中小数怎么四舍五入?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中小数怎么四舍五入?相关的知识,希望对你有一定的参考价值。

有数字类型的字符串,需要做四舍五入,但是没法确定保留几位小数,怎么办?
比如0.19999999999996应该处理成0.2
或者2.45800000000003应该处理成2.458
或者0.00000999999997应该处理成0.00001

按照你的要求为不确定保留几位小数的字符串做四舍五入的Java程序如下

import java.math.BigDecimal;

public class A

 public static void main(String[] args)

  String s="0.00000999999997";

  //四舍五入,length是小数位数

  int length=s.substring(s.indexOf(".")+1).length();

  String s1=String.format("%."+(length-1)+"f",new BigDecimal(s));

  //去尾部0

  BigDecimal bd=new BigDecimal(s1).stripTrailingZeros();

  System.out.println(bd.toPlainString());

 

追问

谢谢,但是还有种情况我忘了说,有些正常的小数,比如1.53 ,或者0.1之类的,如果用这个程序来处理的话就变成了1.5和0,和期望的结果不一样

追答

我定义了一个判断是正常小数还是不正常小数的标准,

末尾超过6位数为9或0的小数需要四舍五入,其它的不变.

修改后的Java程序见图(因为字数限制无法贴代码)

参考技术A

java中如果精确一点的小数位比较多,类型建议使用BigDecimal,数据库存储用decimal类型。

.你的问题是想做四舍五入,并指定精确小数位数。BigDecimal..setScale(需要精确的小数位数例如:3, BigDecimal.ROUND_HALF_UP); 如图所示:如果想要确定小数位数,可以用正则取出需要精确的位数,再去传输需要精确的小数位数。

指定小数位数,并且都做四舍五入即可

参考技术B NumberFormat和DecimalFormat

NumberFormat是Format类的子类,用于国际化格式输出,DecimalFormat是NumberFormat的子类。

对于小数点后位数控制的用法。

 

NumberFormat

public static void main(String[] arg)
  double a = 2222.345;
  //int b = Math.round(a);
  
  //System.out.println(b);
  
  NumberFormat nf= NumberFormat.getNumberInstance();
  nf.setMaximumFractionDigits(2);
  String c = nf.format(a);
  
  System.out.println(c);//输出结果为2222.35.
  
 

 

DecimalFormat

 public static void main(String[] arg)
  double a = 2222.345;
  //int b = Math.round(a);
  
  //System.out.println(b);
  
  DecimalFormat df = new DecimalFormat("#.00");
  String d = df.format(a);
  

  System.out.println(d);//输出结果为2222.35
 

但是如果定义DecimalFormat df = new DecimalFormait("#.000000"),则小数点后数字会进行补位,结果为2222.345000。而nf.setMaximu,FractionDigits(6)则小数点后数位不会进行补位。
参考技术C 您好,java中小数计算可以使用Math函数来计算,可以对数字进行四舍五入 参考技术D 有float类型的 向上取整:Math.ceil() //只要有小数都+1 向下取整:Math.floor() //不取小数 四舍五入:Math.round() //四舍五入

Python中小数四舍五入的处理

由于使用round模块导致小数四舍五入精度不准确,于是自己写了一个四舍五入的方法,方便今后工作中参考!


""""""""""""""""""""""""""""
# -*- coding: utf-8 -*-
# @Time : 2019/12/27 18:09
# @Author : Treasure丶
# @Site :
# @File : demo2.py
# @Software: PyCharm Community Edition
"""""""""""""""""""""""""""""


class rounded(object):
def rounded_Four_Five(self, num, digits):
"""
小数点四舍五入的方法
:param num: 指定的四舍五入的小数
:param digits: 指定保留的位数
:return: 四舍五入后的数字
"""
# 首先判断传入的参数类型是否为浮点型
if isinstance(num, float) == False:
return "该数值类型不为浮点型,无法操作!"
else:
value = str(num)
len_num = len(value) # 获取总长度
index_point = value.find(‘.‘) # 获取小数点索引
if len_num - (index_point + 1) < digits:
return "保留位数入参大于小数位数,无法操作!"
else:
if num > 0:
if int(value[index_point + digits + 1]) >= 5: # 是否入五
num = float(num) + float(str("0.{}1".format(‘0‘ * (digits - 1)))) # 在指定的位数上面+1(这里要考虑数值相加进位的问题)
return float(str(num)[:index_point + digits + 1])
else: # 否则舍四
return float(str(num)[:index_point + digits + 1])
elif num < 0: # 如果是负数
abs_num = str(abs(num)) # 获取绝对值
index_point = abs_num.find(‘.‘) # 需要从绝对值中获取小数点索引位置
if int(abs_num[index_point + digits + 1]) >= 5: # 是否入五
abs_num = float(abs_num) + float(
str("0.{}1".format(‘0‘ * (digits - 1)))) # 在指定的位数上面+1(这里要考虑数值相加进位的问题)
return float(‘-‘ + str(abs_num)[:index_point + digits + 1])
else: # 否则舍四
return float(‘-‘ + str(abs_num)[:index_point + digits + 1])


if __name__ == ‘__main__‘:
d = rounded().rounded_Four_Five(2323.956879089786, 9)
print(d)

以上是关于java中小数怎么四舍五入?的主要内容,如果未能解决你的问题,请参考以下文章

怎么在vb中输出固定小数位数的数字?

matlab中小数如何取整?

js 中小数取整的函数

JAVA 将小数四舍五入成整数的方法

matlab中小数如何取整?

java中对除不尽的数怎么处理