Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >一些“`BigDecimal`”值与“`Float`”不匹配

一些“`BigDecimal`”值与“`Float`”不匹配
EN

Stack Overflow用户
提问于 2016-03-08 14:49:55
回答 2查看 2.1K关注 0票数 5

一些BigDecimal值可以通过eq在Rspec3中与Float进行比较,但有些值不能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe "compare BigDecimal with Float" do
    it { expect("83.79".to_d).to eq(83.79) } # => fail
    it { expect("83.75".to_d).to eq(83.75) } # => succeed
end

为了避免错误,我使用了像eq("83.79".to_d)这样的表达式。

为什么第一次测试失败而第二次测试成功?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-08 15:12:44

您不应该尝试使用浮点值进行任何严格的等式测试。您总是需要处理Float不准确的内部表示问题,因此==!=并不十分有用。

考虑到这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'83.79'.to_d - 83.79
# => #<BigDecimal:7ff33fcea560,'-0.1E-13',9(36)> 
'83.75'.to_d - 83.75
# => #<BigDecimal:7ff33fcee688,'0.0',9(27)> 

请注意,83.79的差异并非完全为零。

如果您需要比较浮点值,则始终需要在比较中使用增量;您总是想说:

这些值是否在彼此之间的一些小数目内?

而不是

这些价值相等吗?

在Rspec方面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect('83.75'.to_d).to be_within(1e-12).of(83.75)
expect('83.79'.to_d).to be_within(1e-12).of(83.79)

并选择增量(在本例中为1e-12)以匹配您的需求。

票数 5
EN

Stack Overflow用户

发布于 2016-03-08 23:19:20

"83.79".to_d精确地在内部表示中表示分数8379/100,因为它使用基数10 (或它的幂),而"83.79".to_f并不是因为内部表示使用基2,因此它们是不相等的。

对于83.75来说,这是不一样的,因为is被精确地表示在基数2和10中(这是83 + 1/2 + 1/4)。

如果将大小数和浮点数混合在同一个表达式中,则浮点数将转换为最近的大小数点.因此,实际上您正在执行以下操作:83.79.to_d或put不同的"83.79".to_f.to_d

因为"83.79".to_f不是精确的,而且由于大小数点比浮点数更精确,所以它没有理由与"83.79".to_d匹配。

但是,如果以另一种方式强制转换,我希望平等适用于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect("83.79".to_d.to_f).to eq(83.79)

这是因为我们可以合理地期望(最少的惊讶)转换to_f将回答最近的浮点到确切的分数,无论是从一个精确的大小数或字符串表示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35879600

复制
相关文章
java bigDecimal 返回最大值,bigdecimal java 最大值,bigdecimal java max方法
当我在处理两个bigDecimal类型变量相减的时候保证结果不为负值,如果为负值则将结果变为0,此时我想到在php中最经典的max函数
高久峰
2023/06/17
5750
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”的解决方案
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(***.obj 中)
AIHGF
2019/02/18
5.7K0
浮点型变量(float和double)和BigDecimal的使用
带小数的变量在Java中称为浮点型,Java的浮点型有两种:float和double。
硕人其颀
2020/06/02
3.7K0
Access不匹配查询
大家好上节介绍了重复项查询,继续介绍选择查询中的不匹配项查询,不匹配查询也是在查询向导中创建。
无言之月
2020/06/04
2K0
EasyCVR级联接入第三方平台,视频流ssrc值与y值不匹配如何解决?
EasyCVR平台级联功能,可以支持平台与平台之间通过国标GB28181协议进行互联互通,实现视频数据的共享与协作。平台可拓展性强、视频能力灵活、部署轻快,支持海量视频汇聚管理。在接入协议上,不仅支持国标GB28181协议、RTSP/Onvif、RTMP等标准协议,还支持HIKSDK、大华SDK、海康Ehome等厂家私有协议与SDK,可分发RTSP、RTMP、FLV、HLS、WebRTC等多种格式的视频流。
TSINGSEE青犀视频
2022/06/14
6950
不掌握这些坑,你敢用BigDecimal吗?
一直从事金融相关项目,所以对BigDecimal再熟悉不过了,也曾看到很多同学因为不知道、不了解或使用不当导致资损事件发生。
程序新视界
2022/07/29
1.4K0
不掌握这些坑,你敢用BigDecimal吗?
Float.floatToRawIntBits的返回值具体意思,将float转为byte数组
我们需要将二维数组变为图片,一般是使用byte转换,也就是先将二维数组里面的float的值使用这个 Float.floatToRawIntBits(9f) 转为int, 之后
一写代码就开心
2022/07/09
7840
使用BigDecimal 进行浮点值的精确计算
输出打印为: b1=>7.2882 b2=>7.1 7.22-7.0=0.1882
Dream城堡
2019/01/28
1.6K0
微信跨公众号支付(appid 与 openid 不匹配)
1、用一个公众号的appid来进行收款 2、这个公众号的appid需要和商户号绑定 3、用这个appid来获取用户的openid
故久
2019/12/03
5.5K0
财务精度:BigInteger 与 BigDecimal
Integer 类作为 int 的包装类,能存储的最大整型值为 2^31-1,Long 类也是有限的,最大为 2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更不用说进行运算了。
RainbowSea
2023/01/23
8270
偏差、方差和数据不匹配
Human-level指人类在目标问题上的error,比如人眼识别猫,人会识别错的error。
Steve Wang
2019/05/26
8950
如何解决iOS打包提示“AppID与profile文件不匹配”
云打包 发布 iOS端 发布 报错 Profile文件中的应用标识 与打包配置的包名不匹配。
iOS程序应用
2023/03/24
1.6K0
new Bigdecimal(double) 和 Bigdecimal.valueof()和BigDecimal(String)
参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
知识浅谈
2020/11/12
2.2K0
Codeigniter文件上传类型不匹配错误
Codeigniter的文件上传类方便了我们使用PHP来处理文件上传的操作,使用起来非常简单,如下:
大江小浪
2018/07/24
2.3K0
CA2017:参数计数不匹配
值 规则 ID CA2017 类别 可靠性 修复是中断修复还是非中断修复 非中断 原因 日志记录消息模板中提供的参数数目与命名占位符的数目不匹配。 规则说明 此规则标志记录器调用的消息参数数目不正确。 如何解决冲突 将模板格式的占位符的数量与传递的参数的数目匹配。 何时禁止显示警告 不禁止显示此规则发出的警告。 另请参阅 可靠性规则
用户4268038
2022/02/20
9040
检测到“RuntimeLibrary”的不匹配项
错误是引用的是静态库,但是配置成动态库导致的,只需要修改成”多线程(/MT)“就可 这段错误的意思就是我调用的是静态库,但是我程序是dll动态,但是我这dll调用静态库就调用不成了吗? 解决方案如下
用户3519280
2023/07/08
1.2K0
Java 代码界 3% 的王者?看我是如何解错这 5 道题的
但遗憾的是,凭借 8 年的 Java 开发经验,我发现这五道题自己全解错了!惨痛的教训再次证明,我是那被秒杀的 97% 的工程师之一。
JAVA葵花宝典
2019/07/22
3390
EasyDSS前端用户管理界面分页与页面内容不匹配的优化
EasyDSS视频平台作为一套网页视频流媒体平台,观看视频推流直播不需要安装插件,网页直接即可播放,且近期我们已经更新了系统的内核,在性能上也会有进一步的提升。
TSINGSEE青犀视频
2021/09/13
1.7K0
float与double的范围和精度
单精度浮点数在机内占4个字节,用32位二进制描述。 双精度浮点数在机内占8个字节,用64位二进制描述。 浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。 数符占1位二进制,表示数的正负。 指数符占1位二进制,表示指数的正负。 尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字。 指数占多少位,尾数占多少位,由计算机系统决定。 可能是数符加尾数占24位,指数符加指数占8位 -- float. 数符加尾数占48位,指数符加指数占16位 -- double.
week
2018/08/24
28.7K0
征集代码界前 3% 的超级王者,解5 道题,结果我被秒杀了
前些日子,阿里妹(妹子出题也这么难)发表了一篇文章《悬赏征集!5 道题征集代码界前 3% 的超级王者》——看到这个标题,我内心非常非常激动,因为终于可以证明自己技术很牛逼了。
Java架构技术
2019/07/10
5130
征集代码界前 3% 的超级王者,解5 道题,结果我被秒杀了

相似问题

BigDecimal VS Float

232

BigDecimal.floatValue与Float.valueOf

21

BigDecimal to_s与to_f不匹配

23

F#关于输入的问题,类型float*float与类型'float‘不匹配

15

为什么BigDecimal的值与构造函数中提供给它的值不匹配?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文