Java中的Float和double数据类型

Leo*_*Leo 212 java floating-point double ieee-754

浮点数据类型是单精度32位IEEE 754浮点数,双数据类型是双精度64位IEEE 754浮点数.

这是什么意思?什么时候应该使用float而不是double,反之亦然?

Mak*_*oto 246

维基百科页面上它是一个良好的开端.

总结一下:

  • float以32位表示,具有1个符号位,8位指数和23位有效数字(或者从科学符号数字开始:2.33728*10 12 ; 33728是有效数字).

  • double 以64位表示,具有1个符号位,11位指数和52位有效数.

默认情况下,Java用于double表示其浮点数字(因此3.14输入文字double).它也是一种数据类型,可以为您提供更大的数字范围,因此我强烈建议使用它float.

有可能是某些库,实际上迫使你的使用float,但一般-除非你能保证你的结果将是足够小,以适应float规定范围,那么最好选择是否同意double.

如果你需要准确性 - 例如,你不能有一个不准确的十进制值(比如1/10 + 2/10),或者你正在用货币做任何事情(例如,在系统中代表$ 10.33),那么使用a BigDecimal,它可以支持任意数量的精度和优雅的处理情况.

  • @AxelH除了可以存在分数美分的财务计算中,金钱总是离散的.您将使用一个整数类型来存储数据.所以$ 5.34将被存储为534.美元部分在整数数学中是val/100,并且整数数学中的分数是val%100,其中%指的是余数运算.对于有超过小数的更多位置的钱,它仍然应该存储为整数,因为它是离散的.即使它不是离散的,通常你也会想要在大多数时候退回到离散存储器,因为它是精确的,所以你不会因为舍入错误而亏本. (9认同)
  • 我正在搜索有关浮点数和双打数的信息,并发现这一点并需要发表评论:如果您使用的货币不涉及小数美分,那么使用BigDecimal是荒谬的.通用货币是离散数据,因此您应该使用整数数据类型.(这是年轻程序员犯下的一个更常见的错误 - 因为我们使用.来将美元与美分分开,他们认为这是一个浮点值.它不是.) (5认同)
  • 在给定的例子中是不是233728 ==尾数?我的意思是,整数部分存储在哪里? (4认同)
  • @TrixieWolf,你能否更具体一点,你是否建议使用两个整数(整数和小数部分)?而你在谈论共同货币,其余的呢?一些金额用6位小数进行评估,所以你不能简单地用"*100".拜托,你有一个观点,但你可以更精确:) (2认同)

Hen*_*nry 69

浮子给你约.6-7十进制数字精度,而双倍给你约.15-16.双倍的数字范围也更大.

double需要8个字节的存储空间,而float只需要4个字节.


Ye *_*Win 13

在计算需要小数精度的表达式时,将使用浮点数(也称为实数).例如,诸如平方根之类的计算或诸如正弦和余弦之类的超级因子导致其精度需要浮点类型的值.Java实现了标准(IEEE-754)浮点类型和运算符集.有两种浮点类型,float和double,分别代表单精度和双精度数.它们的宽度和范围如下所示:


   Name     Width in Bits   Range 
    double  64              1 .7e–308 to 1.7e+308
    float   32              3 .4e–038 to 3.4e+038
Run Code Online (Sandbox Code Playgroud)


浮动

float类型指定使用32位存储的单精度值.单精度在某些处理器上更快,占用的空间是双精度的一半,但是当值非常大或非常小时,将变得不精确.当您需要小数组件但不需要很高的精度时,float类型的变量很有用.

以下是一些示例浮点变量声明:

浮动hightemp,lowtemp;


双精度(由double关键字表示)使用64位来存储值.在一些针对高速数学计算进行了优化的现代处理器上,双精度实际上比单精度更快.所有超越数学函数(如sin(),cos()和sqrt())都返回double值.当您需要在许多迭代计算中保持准确性或正在操纵大值数字时,double是最佳选择.

  • `float`和`double`类型最适合Java中的货币,因为它们为舍入错误提供了机会.本文将详细介绍:http://www.javapractices.com/topic/TopicAction.do?Id=13 (7认同)

Him*_*ngh 5

这会报错:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}
Run Code Online (Sandbox Code Playgroud)

/MyClass.java:3: 错误:不兼容的类型:可能从 double 到 float float a = 0.5 有损转换;

这将完美地工作

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}
Run Code Online (Sandbox Code Playgroud)

这也能完美地工作

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}
Run Code Online (Sandbox Code Playgroud)

原因:Java默认将实数存储为double以确保更高的精度。

Double 占用更多空间,但在计算过程中更精确,而 float 占用更少空间,但精度较低。