Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
在Java中,如果双精度值足够大,则返回一个错误_Java_Type Conversion - Fatal编程技术网

在Java中,如果双精度值足够大,则返回一个错误

在Java中,如果双精度值足够大,则返回一个错误,java,type-conversion,Java,Type Conversion,我基本上是为了学习java而玩数据类型的,下面是我感到困惑的地方 double douVar = 30000000000.323262342134353; int intVar = (int)douVar; // casting System.out.println(intVar); 现在将douVar转换为字符串i覆盖double变量: douVar = 345839052304598; // returns an error: Integer number too long System

我基本上是为了学习java而玩数据类型的,下面是我感到困惑的地方

double douVar = 30000000000.323262342134353;
int intVar = (int)douVar; // casting
System.out.println(intVar); 
现在将
douVar
转换为字符串i覆盖
double
变量:

douVar = 345839052304598; // returns an error: Integer number too long
System.out.println(Double.toString(douVar));
完全错误:

Error:(20, 18) java: integer number too large: 345839052304598
我正在使用IntellijIDEA编译器。虽然我没有在eclipse上尝试这个方法,但我认为编译器不会有太大的不同。
这是否意味着强制转换也会导致修改原始变量?

编译器将文本345839052304598视为
整数,因为该值对于整数太大,因此会引发编译时错误。因此,您需要告诉编译器,您要使用的值实际上是双精度值,您可以通过以下方式执行:

douVar =345839052304598D; // note D at the end which tells comipler that it is double

在Java中,不带小数的常量默认为整数。 有两种方法可以将常量定义更改为双精度定义:

  • 在末尾添加一个
    d
    d
  • 在末尾添加一个
    .0

  • 只需更改
    douVar=345839052304598
    douVar=345839052304598.00

    当您将数字声明为345839052304598时,编译器将尝试将其读取为32位整数。但由于这超出了int的范围,编译器会抛出错误。
    您可以使用d、d或L后缀或添加像.0这样的小数位来处理此问题,

    Java将
    345839052304598
    解释为整数

    在Java中,整数的长度为4字节,因此其值范围为
    -2147483648
    2147483647
    。(您的号码显然不在该范围内)

    要使Java将数字视为双精度数字,必须编写:

    double d = 345839052304598D;
    /* or */
    double d1 = 345839052304598.0;
    

    (对于
    长的
    也是如此,在这种情况下,您必须编写
    L
    而不是
    D

    “强制转换也会导致修改原始变量”?这是什么意思?什么也不会“发生”直到您修复编译错误。很高兴看到这么多有用的回答,尽管对否决票不是很满意,或者也许有人可以解释我获得否决票的原因。我猜可能发生了否决票,因为您的问题标题实际上与您的实际问题无关。作为Java初学者,我认为casting改变了原始变量的数据类型。我就是这样解释的,答案对我来说很清楚。一个
    .0
    就足够了。另一个选项是在数字后添加
    d
    d
    后缀,将其更改为
    double
    。你能告诉我为什么它没有在这个语句中返回一个错误吗:
    double douVar=300000000000.323262342134353这似乎是一个比整数大得多的值。当您使用300000000000.323262342134353时,编译器将检测到一个小数点,这意味着一个双精度值。@DarshanLila数值常量中带有
    的默认数据类型是
    双精度
    ,而不是
    浮点
    double d = 345839052304598D;
    /* or */
    double d1 = 345839052304598.0;