Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的四舍五入和计算小数点后的数字_Java_Algorithm_Double_Rounding - Fatal编程技术网

java中的四舍五入和计算小数点后的数字

java中的四舍五入和计算小数点后的数字,java,algorithm,double,rounding,Java,Algorithm,Double,Rounding,我一直在尝试制作一个程序,在小数点后对双打进行四舍五入-例如-4.45将变为4.50和3.23-3.20等等。 为此,我试着计算小数点后有多少个数字,它们乘以10,我找到的数字加上或减去相应的整数,使之成为一个整数。例如,4.45将首先变成445,然后变成450,然后我再除以我找到的数字,最后得到4.50。 我所做的技术上可行,唯一的问题是计算小数点后的位数。例如,我输入了20.13作为我的double,我试着将它乘以10,直到它等于,就像201.3==201一样,否则我继续乘以10。唯一的问题

我一直在尝试制作一个程序,在小数点后对双打进行四舍五入-例如-4.45将变为4.50和3.23-3.20等等。 为此,我试着计算小数点后有多少个数字,它们乘以10,我找到的数字加上或减去相应的整数,使之成为一个整数。例如,4.45将首先变成445,然后变成450,然后我再除以我找到的数字,最后得到4.50。 我所做的技术上可行,唯一的问题是计算小数点后的位数。例如,我输入了20.13作为我的double,我试着将它乘以10,直到它等于,就像201.3==201一样,否则我继续乘以10。唯一的问题是它破坏了我在调试中的数字。我看到它从201.3变为20.13到201.2999998,这使得我的循环基本上是无限的,完全违背了目的。
我的职能:

//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函数只舍入到整数,例如4.5到5。

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

最好的办法是将数字转换成字符串

String numToString = String.valueOf(num);
找到小数点的索引并删除其中大于2的任何内容

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

最后记下你的最后一个数字,并相应地向上或向下取整。

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

最好的办法是将数字转换成字符串

String numToString = String.valueOf(num);
找到小数点的索引并删除其中大于2的任何内容

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

最后取最后一个数字,并相应地向上或向下取整。

Java使用IEEE 754格式来表示双精度(基64)浮点数。您可以阅读有关Java原语的内容

基本上,这意味着double使用64位,一位表示符号(正或负),11位表示指数,52位表示尾数。您可以通过将尾数乘以2^指数(其中指数可以是负数)来计算数字,然后检查符号位是否为正数或负数。(比这个稍微复杂一点,但这是基本思想。您可以查看IEEE 754格式以了解确切的细节)


所有精度都存储在尾数中,尾数实际上只是一个整数,因为它使用二进制,所以它只能精确地表示分母为2的幂的分数。这意味着无法获得精确表示(例如5.237)的双精度,但可以使用Java中的
String.format()
获得四舍五入到特定小数位数的
字符串
表示。

Java使用IEEE 754格式表示双精度(base-64)浮点数。您可以阅读有关Java原语的内容

基本上,这意味着double使用64位,一位表示符号(正或负),11位表示指数,52位表示尾数。您可以通过将尾数乘以2^指数(其中指数可以是负数)来计算数字,然后检查符号位是否为正数或负数。(比这个稍微复杂一点,但这是基本思想。您可以查看IEEE 754格式以了解确切的细节)


所有精度都存储在尾数中,尾数实际上只是一个整数,因为它使用二进制,所以它只能精确地表示分母为2的幂的分数。这意味着无法获得精确表示(例如5.237)的double,但您可以使用Java中的
String.format()
获得一个
字符串
表示,四舍五入到某个小数位数。

对于只处理double的更通用的解决方案

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);
}
公共静态双循环(双d,整数位){
如果(位置<0)抛出新的IllegalArgumentException(“位置必须>=0”);
返回Math.round(d*Math.pow(10位))/Math.pow(10位);
}
如果输入大量“位置”并舍入一个已经很大的数字,请小心双重溢出


此外,如果您输入的位数比原来的小数位数多,则不会用0填充位数。我认为如果您需要,您必须使用printf才能打印额外的0。

对于只处理双精度的更通用解决方案

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);
}
公共静态双循环(双d,整数位){
如果(位置<0)抛出新的IllegalArgumentException(“位置必须>=0”);
返回Math.round(d*Math.pow(10位))/Math.pow(10位);
}
如果输入大量“位置”并舍入一个已经很大的数字,请小心双重溢出


此外,如果您输入的位数比原来的小数位数多,则不会用0填充位数。我想如果你想打印的话,你必须使用printf来获得额外的0。

你可以简单地复制,
Math.round(num*100)/100d
如果使用
BigDecimal
而不是
double
,它可能会起作用。最简单的方法是使用字符串。查找字符串中的最后一位数字。如果是4或更少,只需将其移除。如果是5或更多,请将其删除,并在前一个数字上添加1。当然,当把1和9相加时,你需要将其带到下一个数字。谢谢你的建议,math.round是有效的,我想你右边的a字符串会更有效。顺便问一下,什么是BigDecimal,如何使用它而不是double?它不是一种类型,因为当我编写它而不是double时,它显示了一个错误。对不起,我的无知,只是我是个新手。你可能的副本可以简单地做,
Math.round(num*100)/100dBigDecimal
而不是