在Java Double到Int中键入转换

时间:2017-12-31 00:46:19

标签: java type-conversion

我正在尝试将2147483648的double值转换为整数,在进行类型转换后,我得到输出为2147483647,数字减少1.我知道这是因为溢出而发生的,但有没有办法我可以将它转换为int类型而不会失去其精度吗?

4 个答案:

答案 0 :(得分:2)

如前面的答案中所述,您可以使用long原始数据类型或BigInteger引用类型。使用整数数据类型而不是浮点数可以更好地准确表示整数。

作为旁注,从Java SE 8开始,可以使用Integer类将int用于无符号算术。根据Oracle doc - "使用Integer类将int数据类型用作无符号整数"。无符号整数的最大值大于int。这个问题很有用:Declaring an unsigned int in Java

这是我的第一个答案,希望你解决了你的问题! :)

答案 1 :(得分:1)

我可以想到2个选项。

int不同,long是32位有符号整数数据类型,9223372036854775807是64位有符号整数数据类型。这意味着它可以存储的最大值是BigInteger。您尝试存储的数字2147483648完全在该范围内。

的BigInteger

这是一个引用类型,表示一个"不可变的任意精度整数"。您可以通过执行

创建表示2147483648的new BigInteger("2147483648") 实例
<div id="register" class="text-center">
   <div class="container">
    <div class="section-title center">
      <h2>Register</h2>
      <hr>
      <form action="<?php echo base_url('c_register/do_insert'); ?>" method="post">
      <link href="<?php echo base_url();?>assets/user/css/login.css" rel="stylesheet">
      <input type="text" name="firstname" id="firstname" placeholder="First Name">
      <span class="text-danger"> <?php echo form_error("firstname"); ?></span>
      <input type="text" name="lastname" id="lastname" placeholder="Last Name">
      <span class="text-danger"> <?php echo form_error("lasttname"); ?></span>
      <input type="text" name="fullname" id="fullname" placeholder="Full Name">
      <span class="text-danger"> <?php echo form_error("fullname"); ?></span>
      <input type="text" name="username" id="username" placeholder="Username">
      <span class="text-danger"> <?php echo form_error("username"); ?></span>
      <input type="text" name="email" id="email" placeholder="Email">
      <span class="text-danger"> <?php echo form_error("email"); ?></span>
      <input type="password" name="pass" id="pass" placeholder="Password">
      <span class="text-danger"> <?php echo form_error("pass"); ?></span>
   <!--    <input type="password" name="pass1" placeholder="Retype Password"> -->
      <ul>
      <p1>Gender</p1>
      <select name="gender" id="gender" class="pilihan">
        <span class="text-danger"> <?php echo form_error("gender"); ?></span>
        <option value="men">Male</option>
        <option value="women">Female</option></select>
      </ul>
      <ul>
      <p1>Occupation</p1>
      <li><input type="radio" name="job" value="doctor" id="doctor" checked> Doctor<br></li>
      <span class="text-danger"> <?php echo form_error("job"); ?></span>
      <li><input type="radio" name="job" value="nurse" id="nurse"> Nurse<br></li>
    </ul>
      <link rel="stylesheet" type="text/css" href="assets/user/login.css">
      <a href="<?php echo base_url('c_register/do_insert'); ?>" class="btn btn-primary btn-lg active" role="button">Primary link</a>
  </form>

点击此处了解详情:https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

答案 2 :(得分:0)

最大值

static final int MAX_VALUEInteger类中指示的最大整数是2 ^ 31-1(2,147,483,647)。该值是最大整数,因为它是最大的32位有符号整数。

static final int MAX_VALUE类在double d = 2147483648; int i = (int) d; 类中指示的最大值为(2-2 ^( - 52))(2 ^ 1023)。 double数据类型遵循双精度64位Double格式来表示各种动态数值。

缩小原始转换

在您观察时,您有一个值为2,147,483,648的double,您尝试按类型转换转换为整数。

double d = 2147483648;
long i = (long) d;

在基本类型之间进行转换允许您将一种基本类型的值转换为另一种基本类型。从double转换为整数称为IEEE 754 floating point,其中:

  

“可能会丢失有关数值整体幅度的信息,也可能会失去精确度和范围。”

浮点数到int的缩小转换如下:

  • 如果浮点数为NaN,则结果是int为0。
  • 否则,如果浮点数不是无穷大,则浮点数舍入为整数值V,使用IEEE 754舍入为零的模式向零舍入。如果此整数值可以表示为int,则结果为V。
  • 否则,以下两种情况之一必须为真:a。该值必须太小,结果是int或b类型的最小可表示值。该值必须太大,结果是int类型的最大可表示值。

如果double值的整数值大于Integer.MAX_VALUE,为了允许表示为整数,使用Integer.MAX_VALUE的值。

避免损失

为了避免精度损失,您需要转换为基本类型或数值对象,其中最大值大于2147483648(并且分辨率允许保持精度)。

Narrowing Primitive Conversion基元类型的最大值为2 ^ 63-1(9.223372e + 18),如果要在数字整数空间内使用数字,这将是一个不错的选择。请注意,虽然Long.MAX_VALUE非常大,但由于浮点格式,Double.MAX_VALUE会更大。

                    <div class="tab-pane fade active in" id="actorDiv">
                        <form role="form" id="addActorForm" action="http://localhost:5000/SearchActor" method="post" onsubmit="loading()">
                            <div class="form-group">
                                <label for="actor">Actor Name</label>
                                <input name="actor" class="form-control"
                                       id="actor" placeholder="Enter actor name"/>
                            </div>
                            <input type="reset" class="btn btn-default">
                            <button type="submit" class="btn btn-default" data-loading-text="Sending...">Submit</button>
                        </form>
                    </div>

答案 3 :(得分:0)

double转换为int,对于大于Integer.MAX_VALUE或小于Integer.MIN_VALUE的数字,将失去精确度。无法将该范围之外的数字表示为int。这在数学上是不可能的。

double转换为long也会失去精确度。对于Long.MIN_VALUELong.MAX_VALUE之外的所有整数,都会发生这种情况。但第二个问题是double本身无法在该范围内表示所有整数...因此在转换<<>>之前会有精度损失< SUP> 1

道德:

如果需要精确表示整数,请不要使用浮点数。使用整数类型(byteshortcharintlong)...或BigInteger

1 - double是64位IEE浮点数,具有52位精度和符号位。相比之下,long具有64位精度(包括符号)。