1. 概述
在Java中,double
和float
是表示小数的数据类型。它们在处理小数时有所不同。
在这篇教程中,我们将探讨double
和float
,并学习如何在它们之间进行转换。
2. Java中的double和float
float
是一种32位单精度浮点类型,可以存储大约7位小数。 当需要节省内存时,这种数据类型具有优势。然而,不建议使用float
处理货币或高精度计算。
声明float
的基本数据类型变量时,我们可以使用float
关键字:
float vatRate = 14.432511f;
对于包装类,应使用Float
类:
Float localTaxRate = 20.12434f;
由于我们处理的是float
,变量应在末尾加上“f”,否则编译器会将其视为double
并报错。
另一方面,double
是一种64位单精度浮点类型,可以存储的小数位数比float
多,大约有大约17位小数。由于其更高的精度,它是小数计算的常见选择。同样,不推荐使用double
进行货币计算(/java-double-vs-bigdecimal)。
以下是使用double
关键字声明double
的示例:
double shootingAverage = 56.00000000000001;
另一种声明double
的方法是通过Double
包装类:
Double assistAverage = 81.123000000045;
在选择使用double
还是float
时,要考虑应用程序的技术需求和业务要求。
3. double和float之间的转换
在技术上,将Double
和Float
之间的转换是很常见的。但在转换时,我们需要谨慎,因为可能会丢失一些小数精度,从而导致应用程序行为出乎意料。
3.1. double转float
让我们演示如何通过强制类型转换进行变量转换:
double interestRatesYearly = 13.333333333333333;
float interest = (float) interestRatesYearly;
System.out.println(interest); //13.333333
Assert.assertEquals(13.333333f, interest, 0.000001f);
由于我们将double
强制转换为float
,新的float
值与原始值相比丢失了一些小数位。为了用assertEquals()
测试这个转换,我们使用了一个delta参数,值为0.000001,这对于转换后的值13.333333来说是足够的。
另一种将double
转换为float
的方法是通过包装类:
Double monthlyRates = 2.111111111111111;
float rates = monthlyRates.floatValue();
System.out.println(rates); //2.1111112
Assert.assertEquals(2.1111111f, rates, 0.0000001f);
在这个例子中,monthlyRates
对象调用了名为floatValue()
的方法,返回一个float
值。与我们的第一个转换示例类似,我们在assertEquals()
的delta参数中使用了0.0000001。
3.2. float转double
接下来,展示如何将float
转换为double
数据类型:
float gradeAverage =2.05f;
double average = gradeAverage;
System.out.println(average); //2.049999952316284
Assert.assertEquals(2.05, average, 0.01);
我们注意到将float
转换为double
的结果与预期不同。问题在于浮点数的二进制表示方式存在精度问题(/cs/floating-point-numbers-inaccuracy)。
另一种将float
转换为double
的方法是通过Double
类的doubleValue()
方法:
Float monthlyRates = 2.1111111f;
Double rates = monthlyRates.doubleValue();
System.out.println(rates); //2.1111111640930176
Assert.assertEquals(2.11111111, rates, 0.0000001);
与前一节的测试一样,我们在本节的单元测试中也使用了delta参数的assertEquals()
。
4. 总结
在这篇文章中,我们讨论了float
和double
数据类型。每个数据类型都有其特性,以及不同的精度范围。double
数据类型的精度比float
更高。然而,float
在内存使用方面有优势,而double
在准确性方面有优势。
本文中的所有代码示例可以在GitHub上找到。