在Java中四舍五入,并计算小数点后有多少个数字



我一直在尝试制作一个程序以在十进制点之后进行双打 - 例如4.45将转4.50和3.23-3.20,依此类推。为此,我试图计算小数点之后的数字有多少个数字,将其乘以10个供电的数字,我发现的数字是相应添加或扣除的,以使其整个整数示例4.45将首先转445,然后是450,然后我再次将其除以我找到的数字,这样我将获得4.50。我在技术上做的事情有效,唯一的问题是计算小数点之后的数字数。例如,我以我的双重输入20.13,然后尝试将其乘以10,直到它相等,直到201.3 == 201,否则我会不断乘以10。只有问题是它在调试中毁了我的数字,我看到它转到20.13 to to201.299999998而不是201.3,这使我的循环基本上是无限的,完全击败了目的。
我的功能:

//input : The function gets a double number
//output : The function returns how many numbers are after the decimal point
public static int countDecimal(double num){
    int count=0;
    while(num!=(int)num){
        num*=10;
        count++;
    }
    return count;
}

有人知道为什么这样做吗?我该如何实现目标?我也很想知道您是否知道第4.45至4.5轮的更简单的方法,因为我的方式需要许多其他功能,并且很长时间才能实现相当基本的东西。我只看到java函数,例如integers-4.5至5。

这是一个非常粗略的答案,但是这个想法就在那里。

最好的事情是将您的号码转换为字符串

String numToString = String.valueOf(num);

找到小数的索引,然后删除任何> 2的

int decimalIndex = numToString.indexOf(".");
numToString = numToString.substring(decimalIndex, decimalIndex + 2);

终于将您的最后一个数字汇总并相应地向上或向下。

用于仅处理双打的更通用的解决方案...

public static double roundIt(double d, int places) {
        if (places < 0) throw new IllegalArgumentException("places must be >= 0");
        return Math.round(d * Math.pow(10, places)) / Math.pow(10, places);
}

如果输入大量"位置"并四舍五入,请注意双重溢出

另外,如果您进入比原始小数的更多地方,则不会以0的位置填充位置。我认为您必须使用printf才能获得额外的0打印。

Java使用IEEE 754格式代表双(基本64(精度浮点数。您可以在此处阅读有关Java原语的信息。

基本上,这意味着双打使用64位,符号的一位(正或负(,指数为11位,而曼蒂萨(Mantissa(则为52位。您可以通过乘以Mantissa Times 2^指数来弄清楚该数字,在该指数中可能为负数,然后检查符号位是否为正或负数。(这比这更复杂,但这是基本的想法。您可以在此处查看IEEE 754格式以获取确切细节(

所有的精度都存储在Mantissa中,这实际上只是一个整数,并且由于它使用了二进制确切代表5.237,但是您可以在Java中使用String.format()String表示为一定数量的小数位置。

最新更新