java四舍五入成整数的方法

java四舍五入成整数的方法    在java的Math类中,提供了许许多多的和数学计算有关的方法,其中也包括取整的,关于取整的有向下取整的floor(doubled)返回值double,rint(doubled),round(doubled)和round(floatf)。   但是,其中和四舍五入相近的方法只有rint和round方法,如果单独使用这两个方法的话,所得到的结果和我们预期的结果不一样,    比如r…

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

    在java的Math类中,提供了许许多多的和数学计算有关的方法,其中也包括取整的,关于取整的有向下取整的floor(double d)返回值double,rint(double d),round(double d)和round(float f)。

    但是,其中和四舍五入相近的方法只有rint和round方法,如果单独使用这两个方法的话,所得到的结果和我们预期的结果不一样,

    比如round(-1.5)所得到的结果是-1,而不是我们预期的-2;

    而rint(-1.5)得到的结果是-2.0,但是rint(2.5)得到的结果却是2.0,和我们预期的3.0也不一样

java四舍五入成整数的方法java四舍五入成整数的方法

    我们分析一下为什么会这样子,首先看一下round方法的API:

Returns the result of rounding the argument to an integer. The result is equivalent to (long) Math.floor(d+0.5).

Special cases:

  • round(+0.0) = +0.0
  • round(-0.0) = +0.0
  • round((anything > Long.MAX_VALUE) = Long.MAX_VALUE
  • round((anything < Long.MIN_VALUE) = Long.MIN_VALUE
  • round(+infinity) = Long.MAX_VALUE
  • round(-infinity) = Long.MIN_VALUE
  • round(NaN) = +0.0

Parameters
d the value to be rounded.

Returns

  • the closest integer to the argument.

即返回一个和参数相近的整型,其结果相当于(long) Math.floor(d+0.5)的值,对于Math.floor(double d)方法,其结果是d向下取整,所以对于round(-1.5)来说,它的返回值是要加上0.5再向下取整,也就是-1.5+0.5=-1.0,1.0向下取整还是1.0,所以返回的是长整型1,但是计算正数的时候就没有这个问题。比如说round(1.5),计算的就是(long)(1.5+0.5)=(long)2.0=2L,所以对于round方法来说对于负数四舍五入所得到的结果是不正确的。

    然后我们来看一下rint方法的API,这个方法与四舍五入差的有点远。

public static double rint (double d)

Added in API level 1

Returns the double conversion of the result of rounding the argument to an integer. Tie breaks are rounded towards even.

Special cases:

  • rint(+0.0) = +0.0
  • rint(-0.0) = -0.0
  • rint(+infinity) = +infinity
  • rint(-infinity) = -infinity
  • rint(NaN) = NaN
Parameters
d the value to be rounded.
Returns
  • the closest integer to the argument (as a double).

    这个方法也是返回一个和参数相近的整型,当有两个整数的时候,会返回偶数的那个。

也就是说,当遇到几点五的时候,才会遇到两个整数,所以对于rint(-1.5)来说,会有-1.0和-2.0两个整数与-1.5相近,但是他会取偶数-2.0,。对于rint(-1.3)只有一个整数-1.0与-1.3接近,所以此时不会有误差。但是对于rint(2.5),有2.0和3.0与2.5接近,他会返回与我们预期不一样的偶数2.0,rint(-2.5)会返回-2.0,所以对于rint方法,当遇到偶数点五的时候,结果会不一样。

    综合上述,如果想用round方法就得解决负数问题,所以可以用绝对值Math.abs方法来解决。下面为代码:

方法一:

public double run(double num){
    double a=Math.signum(num); //判断是正数负数还是0,负数返回-1.0,正数返回1.0
    if(a<0.0)
        return 0.0-Math.round(Math.abs(num));
    return Math.round(num);
}

    如果想用rint方法就得解决偶数点五的问题,下面为代码:

方法二:

public double run(double num){
   if(Math.floor(Math.abs(num))%2!=0)
       return Math.rint(num);
   if(five(num))
       if(Math.signum(num)<0.0)
       return Math.rint(num)-1.0;
   else if(Math.signum(num)>0.0)
       return Math.rint(num)+1.0;
   return Math.rint(num);

}
public boolean five(double n){
    String[] split = String.valueOf(n).split("\\.");
    if(split[1].startsWith("5"))
        return true;
    else return false;
}

    当然也有其他方法,比如用保留小数的方法string的格式化方法都行   

因为方法二效率低,所以建议使用方法一。

本人第一次写博客,还是学生,所以有不足之处请指正,请谅解不足或错误之处,谢谢!

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143511.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 不管这些了三国杀_三国杀身份局胜率

    不管这些了三国杀_三国杀身份局胜率一、【三国杀】是一种什么卡牌游戏?如果给三国杀下一个明确的定义的话,避不开两个词“非集换式”,“桌游”。我个人对“卡牌”有三个理解,崔斯特,集换式,非集换式。崔斯特是一个说话很有腔调的性感小胡子男人。集换式,小时候的水浒卡,三国卡,注重于收藏而非游戏性(当然后来还有了战神镖)。游戏性、竞技性比较强的,游戏王,还有如日中天的炉石(似乎也不算传统意义上的了)。非集换式的,三国杀,广泛点的

    2022年7月27日
    10
  • 水晶易表 Xcelsius 2008 安装指南 完美支持office2010(亲手体验)

    水晶易表 Xcelsius 2008 安装指南 完美支持office2010(亲手体验)

    2021年12月15日
    61
  • 【js】理解普通函数和箭头函数的区别点

    【js】理解普通函数和箭头函数的区别点普通函数在 es5 中就有了 箭头函数是 es6 中出现的函数形式 当然也可以继续用普通函数 普通函数大家知道 形式基本一致来看看箭头函数 开发时根据实际情况可以省略一些东西单条处理可以省略 return 和 大括号 单个参数可以省略 小括号 箭头函数不能作为构造函数不能 new 会报错箭头函数不绑定 arguments 但是可使用 rest 参数这是普通函数 arguments 可以使用

    2025年7月14日
    0
  • pycharm恢复初始设置_pycharm恢复初始设置

    pycharm恢复初始设置_pycharm恢复初始设置PyCharm的配置信息是保存在用户家目录下的.PyCharmxxxx.x目录下的,xxxx.x表示当前使用的PyCharm的版本号如果要恢复PyCharm的初始设置,可以按照以下步骤进行:关闭正在运行的PyCharm在终端中执行以下终端命令,删除PyCharm的配置信息目录:rm-r~/.PyCharm2017.2重新启动PyCharm…

    2022年8月27日
    9
  • qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」

    qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」龙源期刊网http://doc.docsou.com基于QI协议的无线充电通信系统作者:胡江浩张中炜来源:《中国新通信》2016年第03期【摘要】无线充电技术的学名又叫做无线电能传输,其原理非常类似于变压器,都是通过发射电路产生一个交变电流通过初级线圈,从而在初级线圈上感应出一个交变电磁场,次级线圈通过接收该交变电磁场从而产生感应电流,通过电磁感应实现能源的传输。该文主要介绍了一种无线充电领域中…

    2022年6月16日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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