Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我不对double进行任何操作,我可以在Java中保持精度吗?_Java_Floating Point_Double_Precision - Fatal编程技术网

如果我不对double进行任何操作,我可以在Java中保持精度吗?

如果我不对double进行任何操作,我可以在Java中保持精度吗?,java,floating-point,double,precision,Java,Floating Point,Double,Precision,我想以双精度存储0.00到10.00之间的值。我只需要2位数的精度。 如果我没有对double进行任何运算,我能保证总是得到存储在变量中的内容吗 我查看并测试了以下代码: double a = 1.2; double b = 1.1; System.out.println(a - b); System.out.println(a); System.out.println(b); 第一次打印输出的是一个不精确的值,据我所知,解释是机器必须如何不精确地表示数

我想以双精度存储0.00到10.00之间的值。我只需要2位数的精度。 如果我没有对double进行任何运算,我能保证总是得到存储在变量中的内容吗

我查看并测试了以下代码:

    double a = 1.2;
    double b = 1.1;
    System.out.println(a - b);
    System.out.println(a);
    System.out.println(b);

第一次打印输出的是一个不精确的值,据我所知,解释是机器必须如何不精确地表示数字。但是,为什么其他两个打印输出精确的值?就因为我没有做手术?我能假定它总是正确的吗?

不精确性来自于将数字表示为一个
双精度(
)(a)

虽然它确实对浮点值使用算术运算,正如我上面所说的,但问题在于值的存储,尽管打印方法经常试图对我们隐藏这一点。该答案应包含足够的细节:


如果要将十进制数存储(并对其进行操作)到两个小数点的精度,则不应使用
double
s(或
float
s)。相反,您应该考虑使用精确的数字(例如
int
s或
long
s)。对于两个小数点,可以使用
100==1.0
,也可以使用类。

不精确性来自将数字表示为
双精度(

虽然它确实对浮点值使用算术运算,正如我上面所说的,但问题在于值的存储,尽管打印方法经常试图对我们隐藏这一点。该答案应包含足够的细节:


如果要将十进制数存储(并对其进行操作)到两个小数点的精度,则不应使用
double
s(或
float
s)。相反,您应该考虑使用精确的数字(例如
int
s或
long
s)。对于两个小数点,可以使用
100==1.0
,也可以使用类。

以下是打印双精度值内容的几种不同尝试:

import java.math.*;

public class FloatShow {

    public static void main(String ... args) {

        System.out.println(1.2);

        System.out.println(new Double(1.2).toString());

        System.out.println(new BigDecimal(1.2).toString());
    }
}
这是打印出来的

1.2
1.2
1.1999999999999999555910790149937383830547332763671875
println方法给出了一个double框并调用toString,类似地,double使用toString,它为您做一些取整。BigDecimal使用原始值构造实例,并在不进行清理的情况下显示它。所以你关于精度的假设是无效的

浮点和固定小数是两个不同的概念:

在计算中,浮点运算(FP)是一种使用实数的公式化表示作为近似值来支持范围和精度之间权衡的算法。因此,浮点计算通常出现在包含非常小和非常大实数的系统中,这需要快速的处理时间

但固定小数(如BigDecimal)不同,它存储单个数字。BigDecimal使用起来比较慢,但它不能像浮点那样进行范围精度的折衷


浮点运算适用于图形和工程应用,其中计算是瓶颈,输入不完全精确(但在已知误差范围内精确),并且可以计算出速度值得权衡。对于许多业务应用程序来说,性能差异不是问题,因为其他因素总是瓶颈,值是准确的,准确性是不可协商的

以下是打印双精度值内容的几种不同尝试:

import java.math.*;

public class FloatShow {

    public static void main(String ... args) {

        System.out.println(1.2);

        System.out.println(new Double(1.2).toString());

        System.out.println(new BigDecimal(1.2).toString());
    }
}
这是打印出来的

1.2
1.2
1.1999999999999999555910790149937383830547332763671875
println方法给出了一个double框并调用toString,类似地,double使用toString,它为您做一些取整。BigDecimal使用原始值构造实例,并在不进行清理的情况下显示它。所以你关于精度的假设是无效的

浮点和固定小数是两个不同的概念:

在计算中,浮点运算(FP)是一种使用实数的公式化表示作为近似值来支持范围和精度之间权衡的算法。因此,浮点计算通常出现在包含非常小和非常大实数的系统中,这需要快速的处理时间

但固定小数(如BigDecimal)不同,它存储单个数字。BigDecimal使用起来比较慢,但它不能像浮点那样进行范围精度的折衷


浮点运算适用于图形和工程应用,其中计算是瓶颈,输入不完全精确(但在已知误差范围内精确),并且可以计算出速度值得权衡。对于许多业务应用程序来说,性能差异不是问题,因为其他因素总是瓶颈,值是准确的,准确性是不可协商的

Java使用IEEE-754 binary32格式作为其
double
类型。此类型具有这样的特性:对于指数范围内的数字,如果任何有效数字为15或更少的十进制数字转换为
双精度
(使用四舍五入到最近,与偶数相等),并且生成的
双精度
转换回15位十进制数字,则结果等于原始数字

对于浮点数的默认格式,Java生成的数字刚好足够浮点数格式中的数字


这两个属性的结果是,将具有15个或更少有效数字的十进制数字转换为
双精度
,然后使用默认格式将其转换回十进制,将产生与原始数字相等的结果。它可能在某些方面有所不同。例如,原始数字可能有产生的数字没有的尾随零,例如“3.00”到“3”或“123.4500”到“123.45”。

Java使用IEEE-754 binary32格式作为其
类型。