`
TonyLian
  • 浏览: 402104 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【第31条】如果要求精确的答案,请避免使用float和double

阅读更多

   float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算,尤其不适合用来表示货币。

 

    我以前也曾出货类似于为什么 2.0f - 1.9f 的结果不是 0.1f 之类的面试题。原因前面已经说了,其实不管什么语言,只要是标准的单精度浮点双精度浮点类型的实现,就都存在此问题。VB.Net、C#甚至AS3中的Number型(从精度上看应该是Double)也都如此。

 

    好在Java给我们准备了BigDecimal(C#中也可以通过引用java.math使用J#的BigDecimal)。但是BigDecimal是一个非常标准的类,因而对它的加减乘除等运算以及比较大小使用起来要比原生的数值类型要麻烦一些。(Java也不支持操作符重载)

 

   再有一点,就是在跨语言协作时,序列化/反序列化时,其他语言往往没有相应的类型与Java的BigDecimal对应。(AS3就只能用String与之对应)

 

 

 

【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208

 

1
0
分享到:
评论

相关推荐

    c++4课后习题答案完整版

    深入探讨数组的声明、初始化和操作,以及指针的概念、使用和指针运算,包括数组与指针的关系,指针作为函数参数和返回值的使用。 第五章 **表达式**: 涵盖了算术、比较、逻辑、赋值等各类表达式,以及运算符的...

    Java语言程序设计课后习题+答案.pdf

    15. 对于一个三位的正整数 n ،取出它的十位数字k(k 为整型)的表达式是( )。 答案:B) k = ( n - n / 100 * 100 )%10 知识点:Java表达式,使用数学运算符和取余运算符可以提取十位数字。 16. 现有一变量...

    C#实用教程课后答案

    然而,`float`和`double`不能自动提升为`decimal`类型,因为`decimal`提供了更高的精度,选项无答案,应填空缺。 8. 表达式`x%=x-2;`(其中`x`初始化为8)的结果是2,因为`x`首先减去2得到6,然后6除以8得到0余2,...

    2016年计算机二级C语言测试题及答案解析(一).pdf

    这一点在第三题和第五题中有所体现。 其次,C语言的标识符命名有特定的规则。标识符只能由字母、数字和下划线组成,且不能以数字开头。此外,关键字不能作为标识符,例如`case`、`union`等。第六至第八题考察了这些...

    2011年全国计算机等级二级C语言模拟试题及答案(1).doc

    10. 程序中的`adds`函数使用了静态变量m和n,第一次调用时m=1,n=6,返回2;第二次调用m仍为1,n=12,返回2,所以输出是2,2,答案是B。 11. 描述D是错误的,因为可以使用字符串字面量对字符型数组进行整体赋值。 ...

    语言程序设计课后习题答案

    第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的...

    java习题参考答案

    - **应用实例**: 如果需要将 `double` 类型转换为 `float` 类型,需要加上 `F` 或 `f` 作为后缀。 #### 十二、Java图形绘制 **3.5 图形绘制** - **说明**: 示例展示了如何使用Java编写程序来绘制图形。 - **应用...

    java第2章答案

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而著名。在学习Java的过程中,理解和掌握各种概念是非常重要的。本章节主要关注的是Java的基础知识,特别是涉及了选择题、填空题和简答题的...

    应用软件开发C第一次作业.doc

    存储可能包含小数部分的百分制成绩,应使用`double`或`float`类型,但考虑到精度,最好使用`double`,如题目14所示。 题目15中,由于`df`是`double`类型,`n`是`int`类型,正确赋值语句是`f=df`,因为`double`可以...

    Java基础入门习题答案.doc

    - 当一个byte类型的变量和一个int类型的变量进行相加操作时,由于byte的取值范围较小(-128到127),而int的取值范围很大(-2^31到2^31-1),直接相加会导致类型不匹配,需要显式转换或使用自动提升。 2. **编译不...

    Java企业面试题填空题及答案.docx

    这意味着程序的执行流程是从`main`方法的第一条语句开始,直到最后一条语句结束。 7. **公共类的限制**:当Java源文件中有多个类时,其中只能有一个类是公共的(`public`)。这是因为公共类可以在其他包中访问,而...

    2021-2022计算机二级等级考试试题及答案No.12655.docx

    Java中的浮点型数据分为`float`和`double`两种类型,其中`double`类型的精度更高。 #### 13. InputStream类的close()方法 `InputStream`类的`close()`方法用于关闭输入流并释放与之相关的系统资源,这是处理流时...

    Java全阶段综合笔试面试题(含答案)

    - **数值类型**: 包括整型(int、long、short、byte)和浮点型(float、double)。 - **非数值类型**: 包括布尔型(boolean)和字符型(char)。 每种类型都有其固定的大小和范围。 **3. 面向对象的四大特性和理解** - **...

    北大C考试试题

    实型常量在C语言中有三种类型:`float`、`double` 和 `long double`。这些类型的精度依次递增。根据题目选项,正确答案应为实型。 ##### 2. 结构体成员的位域定义正确的是: - **正确答案:b. struct bitfields2 {....

    你必须知道的495个C语言问题

    第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的...

    Java全阶段综合笔试面试题(含答案).docx

    - **基本数据类型**: byte、short、int、long、float、double、char、boolean。 - 每种类型都有固定的内存占用和特定用途。 3. **面向对象的四大特性** - **封装**: 将数据和操作这些数据的方法绑定在一起,并...

Global site tag (gtag.js) - Google Analytics