float 精度

Java面试题之浮点数float

float 精度

浮点数判断大小有陷阱,因为底层的二进制数不能精确表示所有的小数。有时候会产生让人觉得莫名其妙的事情。

Java 浮点数 float和double类型的表示范围和精度

float 精度

对于float来说,4个字节,32位,0-22位表示尾数,23-30(8位)表示指数,31位表示符号位。

float 精度

对于double来说,8个字节,64位,0-51表示尾数,52-62(11位)表示指数,63位最高位表示符号位。

float 精度

float和double的精度是由尾数的位数来决定的。

浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位。

10 进制中,无法准确表达 1/3:

1/3 = 3.333333 x 10^-1

2 进制中,也无法准确表达 0.1:

上述题目的计算过程

float 精度

float 精度

float 变量 a 和b 的比较是严格比较每一位上面的0和1,因此上述2个变量的比较是不相等的。

float 精度

浮点数使用建议

货币之类的精确表示使用整型来存储,计算,表示上进行数值的相互转化。

尽量使用double,而不是 float,中间的计算结果,如果是局部变量,可以使用 double 来进行。但是,存储的时候,建议使用整型或BigDecimal。

扩展思考

进一步提供几个代码示例:

(1)将 float 改用double 类型

public class DoublePrimitiveTest {

public static void main(String args) {

double a = 1.0 – 0.9;

double b = 0.9 – 0.8;

if(a == b){

System.out.println(“true”);

} else {

System.out.println(“false”);

}

if(a == 0.1){

System.out.println(“a==0.1″ + ” true”);

} else {

System.out.println(“a!=0.1”);

}

System.out.println(a);

System.out.println(b);

}

}

输出结果:

true

a!=0.1

0.09999999999999998

0.09999999999999998

建议:

double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型。整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可。

(2)改用BigDecimal 类型

import java.math.BigDecimal;

public class BigDecimalPrimitiveTest {

public static void main(String args) {

BigDecimal m = new BigDecimal(1.0);

BigDecimal n = new BigDecimal(0.9);

BigDecimal l = new BigDecimal(0.8);

BigDecimal a = m.subtract(n);

BigDecimal b = n.subtract(l);

if(a.equals(b)){

System.out.println(“true”);

} else {

System.out.println(“false”);

}

if(a.equals(new BigDecimal(0.1))){

System.out.println(“a==0.1″ + ” true”);

} else {

System.out.println(“a!=0.1”);

}

System.out.println(a);

System.out.println(b);

}

}

输出结果:

true

a!=0.1

0.09999999999999997779553950749686919152736663818359375

0.09999999999999997779553950749686919152736663818359375

BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值(BigInteger的equals方法)是否一致。

本文【float 精度】由作者: C/S结构 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4236.html

(0)
上一篇 2023-03-11 08:27:59
下一篇 2023-03-11 08:34:48

相关推荐

  • 软件开发详细设计文档怎么写

    概述 本文主要为需要编写软件设计/开发文档的读者提供一些经验和建议。 阅读前提 了解 Markdown 语法 了解 Typora、Sublime Text 或 VS Code 等方便编辑 Markdown 的编辑器 面向读者 需要编写产品/功能描述文档的产品经理、项目经理 需要针对待开发功能编写基本设计、详细设计的软件工程师 1. 软件和文档格式选择 一般来…

    2023-03-18
    000
  • dos命令大全及用法pdf,dos命令mig

    DOS命令学习 一、DOS使用常识 DOS的概况 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9x/ME系统都是以它为基础。 常见的DOS有两种:IBM公司的PC-DOS和微软公司的MS-DOS,它们的功能、命令用途格式都相同,我们常用的是MS-DOS。 二、DOS的内部命令 DOS的内…

    2023-03-14
    400
  • 微信小应用是不是有挂_微乐游戏真的有挂吗

    受新冠肺炎疫情的影响,从2020年春节开始,很多人宅在家中,玩起了手机游戏。其中,微信小游戏用户暴增,成为了最受欢迎的小游戏。 微信小游戏迅速升温 相对于体积较大的APP游戏和网络游戏来说,小游戏一般是指体积较小、无需安装、玩法简单,通常为休闲益智类主题的游戏。近一段时间,微信小游戏的用户数据增长了50%。 2017年底,微信推出的小游戏“跳一跳”风靡一时 …

    2023-03-09
    500
  • 3d材质库的材质怎么删除 3d如何一键去掉所有的材质

    今天来讲一下3dmax节点材质编辑器。 很多人在学习3DMAX时都是使用精简模式的材质编辑器。精简模式的材质编辑器结构简单,对于初学者来说比较容易掌握 但当我们在实际工作的时候,往往会用到比较复杂的材质制作逻辑,这时候精简模式的材质编辑器就会显得很不方便。 节点式材质编辑器的优点就在于,它能够把整个材质的编辑过程和逻辑关系以及素材的引用,清晰直观的呈现出来。…

    2023-03-20
    000
  • win7远程桌面连接在哪里_win7远程桌面入站

    应该还有许多用户在使用windows7系统,尽管使用win7系统已经很久了,但还是有许多功能没有了解。有些用户可能需要使用到远程桌面,那么window7远程桌面要怎么连接呢?下面我们就一起来看看windows7远程桌面连接方法。 电脑如何设置远程桌面连接 使用鼠标右键“计算机”图标,选择“属性”打开。 在打开的系统窗口右侧点击“远程设置”按钮,勾选“允许远程…

    2023-03-17
    000
  • mysql数字类型转字符串

    一篇文章来聊一聊如何用好MySQL索引。 为了更好地进行解释,我创建了一个存储引擎为InnoDB的表user_innodb,并批量初始化了500W+条数据。包含主键id、姓名字段(name)、性别字段(gender,用0,1表示不同性别)、手机号字段(phone),并为name和phone字段创建了联合索引。 CREATE TABLE `user_innod…

    2023-03-10
    100
  • android 直播聊天弹幕

    随着 Android 开发走向成熟,每天都会涌现出各种各样与 Android 相关的开发工具,但是我们每天使用的各类库总是不可或缺的。这里,小编向大家推荐一些目前码云上比较具有创意的 Android 库,希望方便大家能够做出更酷更好玩的产品。 当然,如果你很喜欢以下提到的库,别忘了分享给其他人哦。 1. 项目名称: 智能下拉刷新框架 SmartRefresh…

    2023-03-14
    100
  • 开机运行命令怎么关闭(关闭电脑启动项命令)

    win+R 键盘CTRL旁边的四个小方块, win7单击“开始” — “所有程序”—“附件” — “运行”命令,弹出“运行”对话框,输入msconfig 回车 打开如下图:(嗯,我设置过了,一般打开启动选择是正常启动) 这里我们启动选择,选择有选择的启动,接下来点击引导项,勾选无GUI引导。如下图: 然后选择服务项,勾上隐藏所有Microsoft服务这样就少…

    2023-03-15
    000
  • html特殊字符空格的代码_html文本开头空两格

    一、什么是HTML HTML简介 HTML是用来描述网页的一种语言,它是一种超文本标记语言,由一套标记标签组成,在制作网页时,HTML使用标记标签来描述网页。 发展史 HTML:Hyper Text Markup Language超文本标记语言 超文本标记语言—在1993年6月互联网工程工作小组工作案发布(并非标准) HTML2.0—1995年11月作为RF…

    2023-03-11
    300
  • 阿里巴巴p8级别对应的工资待遇_p8是什么职位

    互联网大厂是每位程序员梦寐以求的最佳归宿,BAT一直是互联网大厂的标杆。2010年是移动互联网元年,伴随着移动互联网的迅速发展,中国互联网又催生了多家独角兽如字节跳动、美团、拼多多、快手、滴滴等。而在多家独角兽开展资本、市场、人才激烈的争夺中,程序员的待遇也自然水涨船高。 这里简单梳理一下阿里巴巴内部的职位级别和薪资待遇。 职位级别一览表 不同级别程序员年薪…

    2023-03-11
    300

发表回复

登录后才能评论
返回顶部
错说博客上线啦!