Java中的浮点和int值减法

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

我认为,在某种程度上,跟踪与浮点值的精度有关,但我不确定如何以及为什么会观察到跟踪行为。我用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);
        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亿倍。