我在舍入方面遇到了麻烦.具体来说,在阅读完所有的 javadoc后,我期待以下代码:
int n = (integer between 0 and 9,included)
new BigDecimal(n + 0.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()

返回n 0.56.相反,这些是n从0到4的返回值:

new BigDecimal(0.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()
 0.56
 new BigDecimal(1.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()
 1.55
 new BigDecimal(2.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()
 2.56
 new BigDecimal(3.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()
 3.56
 new BigDecimal(4.555d).setScale(2,RoundingMode.HALF_UP).doubleValue()
 4.55

我也尝试改变舍入模式:

int n = (integer between 0 and 9,RoundingMode.HALF_DOWN).doubleValue()

期望每个n的结果为n 0.55.相反,返回值与前一个示例完全相同:

new BigDecimal(0.555d).setScale(2,RoundingMode.HALF_DOWN).doubleValue()
 0.56
 new BigDecimal(1.555d).setScale(2,RoundingMode.HALF_DOWN).doubleValue()
 1.55
 new BigDecimal(2.555d).setScale(2,RoundingMode.HALF_DOWN).doubleValue()
 2.56
 new BigDecimal(3.555d).setScale(2,RoundingMode.HALF_DOWN).doubleValue()
 3.56
 new BigDecimal(4.555d).setScale(2,RoundingMode.HALF_DOWN).doubleValue()
 4.55

我错过了什么吗?

解决方法

你遇到的问题是double不是一个精确的表示,你基于这个不精确的数字是圆的.
BigDecimal bd = new BigDecimal(1.555d);
System.out.println("bd=" + bd);
bd = bd.setScale(2,RoundingMode.HALF_UP);
System.out.println("after rounding bd=" + bd);
double d = bd.doubleValue();
System.out.println("after rounding d=" + d);

版画

bd=1.5549999999999999378275106209912337362766265869140625
after rounding bd=1.55
after rounding d=1.55

然而

BigDecimal bd = BigDecimal.valueOf(1.555d);
System.out.println("bd=" + bd);
bd = bd.setScale(2,RoundingMode.HALF_UP);
System.out.println("after rounding bd=" + bd);
double d = bd.doubleValue();
System.out.println("after rounding d=" + d);

版画

bd=1.555
after rounding bd=1.56
after rounding d=1.56

这是有效的,因为BigDecimal.valueOf会根据打印时出现的双倍进行一些额外的舍入.

但是,除非性能/简单性不是问题,否则我不会使用BigDecimal.

double d = 1.555d;
System.out.println("d=" + d);
d = roundToTwoPlaces(d);
System.out.println("after rounding d=" + d);

public static double roundToTwoPlaces(double d) {
    return ((long) (d < 0 ? d * 100 - 0.5 : d * 100 + 0.5)) / 100.0;
}

版画

d=1.555
after rounding d=1.56

有关更多详细信息,Double your money again比较了不同舍入方式的性能.

java.math.RoundingMode是如何工作的?的更多相关文章

  1. Swift开发教程--如何自定义TabBarItem的图片显示

    在做项目的时候,如果使用系统的UITabBarController的时候,底部的tab自定义图片显示是蓝色和灰色的,这不是我们所想要的效果。如果想显示自定义的按下和弹起的图片效果,这个时候就需要对TabBarItem进行修改。以下就是具体的示例:varitemNameArray:[String]=["down_32","add_32","plane_32","circle_32"]varitemNameSelectArray:[String]=["down_click_32","add_click_32"

  2. 如何在Swift(iOS,Xcode)中将NSDictionary转换为Json String?

    .我的NSDictionary是这样的:但如果我打印这个,输出是这样的:我怎样才能得到精确的Json字符串?无需实现这种复杂的逻辑,你可以简单地做到这一点如果你想用API发送它到服务器,甚至不需要将它转换为String

  3. android – 当从View的LongPress触发DOWN事件时,从Dialog注册UP / CANCEL

    我有一个UX要求,即用户通过长按GridView中的单元格来触发Dialog.>显示对话框时,用户必须能够在屏幕周围移动手指/拇指,而不会在离开GridView单元格边界时触发UP/CANCEL事件.>当用户最终断开与屏幕的联系时,我正在寻找捕获.GridView似乎记录了UP/CANCEL的一些误报,我们没有看到使用任何其他视图.>问题是原始视图捕获所有触摸事件,因为DOWN被它捕获.>在原始视

  4. android – 按钮上的单击,按下和释放事件

    如何检测按钮的单击,按下和释放状态.我想在这些状态下执行不同的功能.点击我想调用function1,按下我想调用function2然后在接收时我想调用function3.我们可以使用View.OnClickListener检测点击状态.我们可以使用View.OnTouchListener检测Button的pressed和Released状态,并处理ACTION_DOWN和ACTION_UP.我能够

  5. android – 触摸时绘制圆圈

    我想画一个用户触摸屏幕的圆圈.解决方法我会这样做:

  6. Android中点击和点按的区别

    我可以使用此方法从onclick方法实现我想要的相同行为吗?

  7. 在Android中获取onTouch ACTION_MOVE事件的速度

    用户在手势时拖动手指的速度较慢或者更快,所以我想我需要计算两个中间触点之间的速度:lastTouchedPointX,lastTouchedPointY和event.getX(),event.getY().以前有人做过吗?

  8. android – MotionEvent中ACTION_CANCEL和ACTION_UP有什么区别?

    我想在屏幕上跟踪手指触摸.那么我做的是在MotionEvent触发ACTION_DOWN时开始记录位置,但是如何知道动作完成时间,ACTION_CANCEL或ACTION_UP?他们之间有什么区别?

  9. AmazeUI 网格的实现示例

    这篇文章主要介绍了AmazeUI 网格的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. jQuery 自定义下拉框(DropDown)附源码下载

    这篇文章主要介绍了jQuery 自定义下拉框(DropDown)的相关资料,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部