根据JavaDoc
for BigDecimal
,该compareTo
函数在比较期间不考虑比例。
现在,我有一个测试用例,看起来像这样:
BigDecimal result = callSomeService(foo);
assertTrue(result.compareTo(new BigDecimal(0.7)) == 0); //this does not work
assertTrue(result.equals(new BigDecimal(0.7).setScale(10, BigDecimal.ROUND_HALF_UP))); //this works
我希望函数返回0.7
的值是10,小数位数为10。打印该值可显示预期的结果。但是该compareTo()
功能似乎并未按照我认为的方式工作。
这里发生了什么?
new BigDecimal(0.7)
并 没有 代表0.7。
它代表0.69999999999999999999555910790149937383830547332763671875(精确)。
原因是double
文字0.7
不完全代表0.7。
如果需要 精确的 BigDecimal
值,则 必须 使用String
构造函数(实际上, 所有
不使用double
值的构造html" target="_blank">函数都可以使用)。
试试吧new BigDecimal("0.7")
。
构造函数的JavaDocBigDecimal(double)
具有一些相关的注释:
此构造函数的结果可能有些不可预测。有人可能会假设使用
new BigDecimal(0.1)
Java 编写的代码创建的a
BigDecimal
等于0.1(非标度值为1,小数位数为1),但实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double
(或就此而言,表示为任何有限长度的二进制分数)。因此,尽管出现,但是传递给构造函数的值并不完全等于0.1。该
String
构造,在另一方面,是完全可以预测的:写作new BigDecimal("0.1")
产生了BigDecimal
这
恰好
等于0.1,正如人们所期望的那样。因此,通常建议优先使用该String
构造函数。3.
当double
必须将用作的源时BigDecimal
,请注意,此构造函数提供了精确的转换。与使用方法然后使用构造函数将转换double
为的结果不同。要获得该结果,请使用方法。String
Double.toString(double)
BigDecimal(String)
static
valueOf(double)
总结一下:如果要创建一个BigDecimal
具有固定十进制值的,请使用String
构造函数。如果您 已经有
一个double
值,那么BigDecimal.valueOf(double)
将提供比使用更直观的行为new BigDecimal(double)
。
问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir
问题内容: 我是否错过了明显痛苦的事情?还是世界上没有人真正使用java.util.BitSet? 以下测试失败: 我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false且从未设置为任何值… (请注意,在构造函数中显式设置BitSet的大小无效,例如: 问题答案: 人们确
问题内容: 以下Dockerfile: 具有输出: 构建时(docker build命令) 看来RUN cd tmp123没有任何作用 为什么呢? 问题答案: 实际上是预期的。 泊坞窗文件不过是docker run + docker commit的包装器。 与做相同的事情: 每次运行时,都会生成一个新容器,因此pwd为’/’。 如果您愿意,可以在github上打开一个问题,以便向Dockerfil
我试着将一个双精度值四舍五入到小数点后两位: var x=0.68999995 var roundX=round(x*100.0)/100.0 println(roundX)//打印0.69 如果打印值是正确的...但var值不是我期望的,继续0.68999999999999995 我需要双值...不像其他StackOverflow答案那样字符串:(
问题内容: 当使用带点名的名称时,例如:,返回的模块不是,返回的内容几乎都是空的!这里发生了什么? 问题答案: 从python文档上: … 当name变量的形式为package.module时,通常返回顶级包(名称直到第一个点),而不是按名称命名的模块。但是,当给出非空的fromlist参数时,将返回按名称命名的模块。这样做是为了与为不同种类的import语句生成的字节码兼容。使用“ import
问题内容: 我将 Jasmine 和 Karma 一起使用,以测试基于 Angular 构建的应用程序。 我必须测试加载用户数据的服务,并且使用 $ httpBackend 模拟响应。但是,当我运行测试时,出现两个错误: 错误:没有等待刷新的请求! 错误:请求不满意:GET https://api.github.com/users/wilk 模块: 测试: 假设GITHUB_API_URL等于 ‘