我正在尝试将2147483648的double值转换为整数,在进行类型转换后,我得到输出为2147483647,数字减少1.我知道这是因为溢出而发生的,但有没有办法我可以将它转换为int类型而不会失去其精度吗?
答案 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完全在该范围内。
这是一个引用类型,表示一个"不可变的任意精度整数"。您可以通过执行
创建表示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_VALUE
在Integer类中指示的最大整数是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的缩小转换如下:
如果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_VALUE
到Long.MAX_VALUE
之外的所有整数,都会发生这种情况。但第二个问题是double
本身无法在该范围内表示所有整数...因此在转换<<>>之前会有精度损失< SUP> 1
如果需要精确表示整数,请不要使用浮点数。使用整数类型(byte
,short
,char
,int
或long
)...或BigInteger
。
1 - double
是64位IEE浮点数,具有52位精度和符号位。相比之下,long
具有64位精度(包括符号)。