Java中的浮点和int值减法
我认为,在某种程度上,跟踪与浮点值的精度有关,但我不确定如何以及为什么会观察到跟踪行为。我用java编写了以下代码:Java中的浮点和int值减法,java,type-conversion,Java,Type Conversion,我认为,在某种程度上,跟踪与浮点值的精度有关,但我不确定如何以及为什么会观察到跟踪行为。我用java编写了以下代码: class float_int { void float_to_int(float val) { int int_val = (int)val; float remain_val = val - (float)int_val; System.out.println("val - " + val); S
class float_int
{
void float_to_int(float val)
{
int int_val = (int)val;
float remain_val = val - (float)int_val;
System.out.println("val - " + val);
System.out.println("int_val - " + (float)int_val);
System.out.println("remain_val - " + remain_val);
}
public static void main(String args[])
{
float_int obj = new float_int();
obj.float_to_int((float)12.345);
}
}
我得到以下输出:
val - 12.345
int_val - 12.0
remain_val - 0.34500027
现在我不知道为什么在剩余值的末尾会有一个额外的“27”。因为
12.345
和0.345
都不能用二进制浮点表示
:
在上面的代码中,12.345000267028809是最接近的可以精确表示的值。,因为
12.345
和0.345
都不能精确表示为二进制浮点
:
在上面的代码中,12.345000267028809是最接近的值,可以准确地表示。您是正确的,这是因为浮点数不精确 如果您希望正确表示您的浮动,您可以使用这家伙似乎采取的相同方法: 这是为了使浮子四舍五入:
String.format("%.2f", 1.2399) // returns "1.24"
String.format("%.3f", 1.2399) // returns "1.240"
String.format("%.2f", 1.2) // returns "1.20"
你是对的,这是因为浮动不精确 如果您希望正确表示您的浮动,您可以使用这家伙似乎采取的相同方法: 这是为了使浮子四舍五入:
String.format("%.2f", 1.2399) // returns "1.24"
String.format("%.3f", 1.2399) // returns "1.240"
String.format("%.2f", 1.2) // returns "1.20"
为什么是“27”或者只是随机的?@pkumar。。只要试着把
0.345
转换成base 2
,你就会知道了。是时候拿出笔和纸了。不要只相信陌生人。@pkumar。一旦你成功地转换成base 2,你就应该进行浮点标记了。为什么是“27”或者只是随机的?@pkumar。。只要试着把0.345
转换成base 2
,你就会知道了。是时候拿出笔和纸了。不要只相信陌生人。@pkumar。一旦你成功地转换成base 2,你就应该仔细检查一下-浮点
标记wiki了。我建议使用double
,除非你有很好的理由。你仍然会看到这些问题,但它们会小10亿倍。我建议使用double
,除非你有很好的理由。你仍然会看到这些问题,但它们会小10亿倍。