精华内容
下载资源
问答
  • Java面试官:兄弟,你确定double精度比float低吗?

    万次阅读 多人点赞 2019-03-31 07:25:46
    你确定double精度比float低吗 ?” 东丰:“那当然啊,double只精确到小数点后两位,double这个单词的意思不就是二的意思吗?” 老刘:“东丰,你右手边刚好有一本《 Java核心技术卷1 》,你翻到第35页,看一下...

    我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的“程序员”;穿着也非常“不拘一格”,上半身是衬衣西服,下半身是牛仔裤运动鞋。

    我和老刘的感情非常好,每周末我们都要在一起吃顿饭。这周,我们吃的是洛阳有名的吴家刀削面,席间他聊了一件蛮有趣的面试经历;我听得津津有味。

    散席的时候,老刘特意叮嘱我把他和面试者的对话整理一下发出来,因为他觉得这段对话非常的精彩,值得推荐给更多初学Java的年轻人。

    注:以下是老刘和面试者东丰的真实对话。如有雷同,请勿对号入座

    老刘:“东丰,你长期从事金融软件的开发,记录存款和金额之类的有关数据用哪种数据类型啊?”

    东丰:“当然用float啊,精确度比double高嘛。”

    老刘:“东丰,你确定double精度比float低吗?”

    东丰:“那当然啊,double只精确到小数点后两位,double这个单词的意思不就是二的意思吗?”

    老刘:“东丰,你右手边刚好有一本《Java核心技术卷1》,你翻到第35页,看一下。”

    东丰:“…哦,刘经理,不用了。不好意思,刚刚开个玩笑,为了缓和一下面试的紧张气氛。看您厚厚的眼镜片下藏着一双深邃的眼睛,我觉得您一定大有学问。在金融计算中,必须要使用BigDecimal,double和float都不适合。因为单单一个精度问题就能把人整晕了。”

    “我记得有一次,我碰巧要计算一个表达式a - b,a的值为2,b的值为1.1,我侄女五岁半都知道答案应该是0.9,结果程序算出来的结果竟然是0.89999…,我当时又气又激动,气的是计算机还没有我侄女靠谱,激动的是我竟然第一次找到了Java的bug。”

    “我赶紧把这个bug反馈到了沉默王二的青铜时代群,以为我要被大家点赞表扬了。结果收到了大佬们一致的无情的嘲笑!”

    “好在,群主二哥及时地安慰了我。他发我私信说:‘首先,计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。double和float提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了你看到的不正确的结果。’”

    “看到二哥的信息后,我沮丧的心情得到了很大的安慰。我于是就对使用浮点数和小数中的问题进行了深入地研究。”

    “BigDecimal可以表示任意精度的小数,并对它们进行计算。但要小心使用 BigDecimal(double) 构造函数,因为它会在计算的过程中产生舍入误差。最好要使用基于整数或 String 的构造函数来创建BigDecimal对象。”

    老刘:“哇,你回答得很好。那我们来看下一个问题。你应该知道2 / 0的时候程序会报java.lang.ArithmeticException的错误,那么你知道2.0 / 0的结果吗?”

    东丰:“刘经理,您这个问题难不倒我。结果是Infinity(英菲尼迪),不好意思,我的英语口语能力有限啊。其实就是无穷的意思。不仅有正无穷大,还有负无穷大,甚至还有一个叫做NaN的特殊值。NaN代表‘不是一个数字’。这些值的存在是为了在出现错误条件时,程序还可以用特定的值来表示所产生的结果。这些错误的情况包括算术溢出、给负数开平方根,还有您说的除以 0 等。”

    老刘:“东丰啊,你的发音比我好啊,挺准确的。”

    东丰:“刘经理您见笑了。”

    老刘:“我这还有一道关于数组的问题,你稍等一下,我在纸上写一下。”

    int[] a = {1, 2, 3, 4}
    int[] b = {2, 4}
    int[] c = {1, 3}
    int[] d = {2}
    

    “有这样四个数组,要求每个数组只留一个唯一的元素。也就是说,a、b、c、d四个数组之间的元素不能相同,你打算怎么做呢?”

    东丰:“刘经理,我能用一下您的凌美钢笔吗?”

    老刘:“可以啊,你请用。”

    东丰:“我大致演算了一下。说一下我的思路。d只能是2,b只能是4,a是1或者3,c是3或者1。遍历长数组,剔除长数组中含有的最短数组的元素。b中剔除d中的2还剩下4,a中剔除d中的2还剩下1、3、4,c中不含d中元素,所以不用剔除。剔除后b中还剩下一个4,d中是一个2。再次遍历剔除a中的4。最后a和c中只剩下1和3了,再分别剔除互异的数就行了。”

    “我觉得比较笨的作法,刘经理您觉得可行吗?”

    老刘:“可行,没有问题。那,你对变量和方法的命名有什么看法呢?请随意发挥啊。”

    东丰:“我在博客园上曾看到一个有意思的投票统计——选出平常工作时自己认为最难的事情,选项大致有:”

    • 写各种文档
    • 与客户沟通
    • 预估工作量
    • 给变量命名

    “投票结果完全出乎我的意料,排在第一的竟然是‘给变量命名’!变量命名实在是软件开发中最常见的一件事了,但这件事要想做好,还真是不容易啊。”

    “阿里巴巴Java开发手册中「强制」规定,方法名、参数名、成员变量、局部变量要统一使用lowerCamelCase风格,必须遵从驼峰形式。”

    localValue // 变量
    getHttpMessage() // 方法
    

    “有很长一段时间,我总是在纠结究竟是用拼音好还是用英语单词好的问题。后来我下定了决心:要么用拼音要么用英语单词,只要看到名字就能知道这个变量或者方法的用意就行了。”

    “有时候,确实很难给变量取一个好名字。这时候,我就会选择一种省时省力省心的做法——将变量名命名为类型名。比如说:”

    Map map;
    List list;
    

    “最好,变量声明的地方要离第一次使用的地方近。否则的话,代码阅读起来会很困难,因为人眼睛接受的屏幕高度是有限的。”

    老刘:“东丰啊,你非常的优秀。恭喜你,你的面试过了。你回去准备一下,下周一就可以来上班了。”

    再注:以上是老刘和面试者东丰的真实对话。如有雷同,请勿对号入座


    上一篇:对《Java核心技术卷一》读者的一些建议

    下一篇:请用面向对象的思想,谈一谈这次面试的过程

    谢谢大家的阅读,原创不易,喜欢就随手点个赞👍,这将是我最强的写作动力。如果觉得文章对你有点帮助,还挺有趣,就关注一下我的公众号「沉默王二」。

    展开全文
  • double 精度

    千次阅读 2011-11-02 20:19:41
     float和double的范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double:  1bit(符号位) 11...
     
    

    1. 范围
      float和double的范围是由指数的位数来决定的。
      float的指数位有8位,而double的指数位有11位,分布如下:
      float:
      1bit(符号位) 8bits(指数位) 23bits(尾数位)
      double:
      1bit(符号位) 11bits(指数位) 52bits(尾数位)
      于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
      其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
      float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

    2.  精度
      float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
      float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
      double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

    展开全文
  • float double精度的详细解释,小数点位数等等
  • ACM double精度问题

    千次阅读 2014-08-13 15:35:33
    double精度问题 使用int,避免double

    1.

    double精度问题

    使用int,避免double精度引起错误


    如:

    double p;

    a>b*p%

    转化为 

    int p; 

    a*100 > b*p

    (没有使用double)


    2.

    -0.000000314
    四舍五入会输出-0
    如:0.0000



    展开全文
  • java中double精度丢失
    public static double getRound(double d, double n) {
    		d = d * Math.pow(10, n);
    		if(d>0){
    			d += 0.5d;
    		}else{
    			d -= 0.5d;
    		}
    		d = (long) d;
    		d = d / Math.pow(10d, n);
    		return d;
    	}

    展开全文
  • 下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • float和double精度问题

    2017-01-05 16:03:25
    double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双...
  • import java.math.BigDecimal; import java.text.DecimalFormat; import org.junit.Test; ...public class BigDecimalTest { ... * double精度丢失问题处理****** * 精度丢失原因:double、float执...
  • Java String 转double 精度丢失

    千次阅读 2020-08-18 18:18:35
    Java String 转double 精度丢失 原本是我写了一个除法的方法然后返回值是 BigDecimal类型的数据 原代码 float num = (float) num1 * 100 / num2; // num1 = 1 num2 = 1 DecimalFormat df = new DecimalFormat(...
  • c语言中,double精度

    千次阅读 2017-12-07 13:36:30
    c语言中,double精度数比较大小时,因精度问题,=号比较有坑,尽量避免使用!
  • 该工具用户进行double类型的精度计算,包含加法、减法、乘法、除法、精确点计算、小数点计算,限制小数点后数字
  • 红颜丽人 追求技术就像追求爱情! 跳至内容 博客首页  JAVA程序开发  LINUX系统学习  ...java浮点类型float精度与Double精度范围实例使用说明 ...java浮点类型float精度与Double精度范围实例
  • 今天跑项目的时候遇到一个bug,在给红包均分金额的时候,尝试了用double型的3.3分给三个红包,结果出现了1.0999999999999999的结果,尝试解决,就发现了Java中double精度存在问题,然后尝试一下C语言,结果是1.1,并...
  • double 0.0111 乘以 10的6次方 11100 11100 乘以 10的负6次方 double 0.01109999999 可以这样 double exchange = exchangeNumerator * 1d / exchangeDenominator; //获取到转换展示单位的值 double...
  • 使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的...
  • 在用Double进行计算处理时,经常出现精度缺失问题,我们应该使用BigDecimal来处理。 BigDecimal的构造方法中用来转换数据为BigDecimal有下面两种: public BigDecimal(String val); public BigDecimal(double val)...
  • QString toDouble精度问题

    千次阅读 2020-11-24 11:09:31
    QString toDouble后,因为精度问题,会造成相加、相加、比较时,不准备。 现在把需要处理的double 放大10的N次方后,变成整数后,再进行相加相减处理,然后再缩小10的N次方倍。 代码如下: //获取小数位 int ...
  • float,double精度

    千次阅读 2017-06-20 10:00:02
    Double与float类型 ...指数位表示浮点的位置,占位8位,无符号存储,取值范围:0-256,其与实际指数的偏差值为127,尾数表示数值的精度,占位23位。 我们以8.25为例来进行说明: 8.25用二进制表示可表示为1000.
  • 聊一聊Java中double精度去哪了

    千次阅读 2016-07-02 11:53:10
    聊一聊Java中double精度去哪了 转载地址:https://www.iovi.com/post/2014-07-07-talk-about-double-in-java.html 前段时间, 因为要测试一个刚出炉的高频策略, 放实盘去跑吧, 怕出岔, 所以写了个简单的...
  • double 精度问题

    千次阅读 2011-10-21 16:38:43
    使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的...
  • Java Double精度问题总结

    千次阅读 2013-05-18 09:20:54
    原文地址:http://zhaow-381002134.iteye.com/blog/420369 ... * 对double数据进行取精度. * @param value double数据. * @param scale 精度位数(保留的小数位数). * @param roundingMode 精度取值方式.
  • Qt中double精度设置

    万次阅读 2017-04-05 11:53:52
    所面临的问题:要保证用户输入的值是Double类型,并且保证输出的精度和用户的一致。解决办法:最简单的一种方法是利用QInputDialog,获取一个double,然后在lineEdit中显示,最后保存到文件中。 界面: 代码...
  • double精度丢失和避免方法

    千次阅读 2019-05-21 22:08:56
    double取余数:% private void test(){ double mainByNumber = 3.3D; double spc = 0.1D; double result = mainByNumber % spc; double result = mainByNumber * spc; ...
  • float与double精度丢失问题

    千次阅读 2018-05-14 14:27:17
    解决一个价格转换显示的bug double a=Double.parseDouble(3.80); long price=new Double(a*100).longValue();结果是3.799999999.......大部分程序员都知道浮点类型不能用来做精确表示和运算,对根本原因能随口说来的...
  • Java float和double精度范围大小

    万次阅读 2018-03-28 16:37:46
    要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的: 举个例子:78.375,是一个正小数。要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换:   一 小数的...
  • C#double精度

    万次阅读 2011-01-04 14:40:00
    <br />用Convert.ToDouble可遵循四舍五入法,且参数可为int与string等 Double mf1 = 10000.0; Double mf2 = 10000.12345; Double mf3 = 10000.1289; Double mf4 = 95.12345; Int mf5 = 10000; ...
  •  float和double的范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double: 1bit(符号位) 11bits...
  • jsoncpp double精度问题及控制

    千次阅读 2020-03-16 15:06:09
    在使用 jsoncpp 的时候,发现double类型数据在组成 json 数据时小数保留位较多,查询资料后才发现,jsoncpp 已经把double数据保留位写死了,这里sprintf(formatString, “%%.%dg”, precision);的结果是“%.17g”,...
  • double精度问题_杂

    千次阅读 2018-02-13 09:52:43
    无类型的文件, 直接去掉后缀即可, 如sublime的默认文件类型 ...因为double这种浮点型的数在计算机中是按照二进制存储的, 而一个double数是64位, 8Byte期中指数位11位, 尾数为52位(二进制) 一个介绍浮点数的连接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 194,236
精华内容 77,694
关键字:

double精度