下面是一个程序,它应该计算小数点后的双倍值中的位数。在输入一些双值时,程序倾向于开始一个无限循环(可能是由于浮点不精确)。我不想使用任何包装器方法(包括String类)。有人可能为某些输入的无休止循环提供解释并提供解决方案吗?
import java.util.*;
class Flt
{
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
System.out.print("Enter a double number: ");
double f = sc.nextDouble();
double tmp = f;
int len = 0;
while(tmp != (int) tmp)
{
tmp *= 10;
len++;
}
System.out.println(len);
}
}
问题是在向int
的转换中溢出的,因此tmp!=(int)tmp
永远不为true。
考虑用户输入“3.1415”。3.1415不能以双
html" target="_blank">格式表示,因此将其转换为最接近的可表示值3.14150000000000000181188397618825547397136688232421875。首先,它有太多的十进制数字,即使用精确的实数算术执行乘以十,它们也不会产生整数结果,直到数字达到31415000000000000181188397618825547397136688232421875。但是,该数字不能在没有溢出的情况下转换为int
,因为它太大,无法在int
中表示。转换生成int
中可表示的最大值2147483647。然后将数字314150000000000000181188397618825547397136688232421875与转换结果2147483647进行比较,表明它们不相等,循环继续。
事实上,乘以10并不是用精确的实数算术来执行的。在每次乘法中,结果被舍入到double
中可表示的最接近的值。所以第一个收益是31.415000000000000002700062395888380706310272216796875,下一个收益是314.1500000000003410605131648480892181396484375,以此类推。第一个整数结果是31415000000000004。同样,这个值太大,无法在int
中表示,所以tmp!=(int)tmp
被计算为31415000000000004!=2147483647
,这当然是正确的,所以循环继续。
可以通过消除对int
的转换来解决无限循环。例如,可以用tmp%1!=0
替换测试表达式来循环,只要tmp
在除以1时有余数(因此不是整数)。但是,输入“3.1415”会产生16--它不计算用户输入中的小数位数,也不计算通过扫描它而产生的双击
,而是循环数,直到用舍入进行乘法得到整数。
一旦用户的输入转换为双
,就无法正确计算用户输入中的小数点位数,因为原始值丢失了。如果用户输入“3.1415”或“3.1415000000000000181188397618825547398232421875”,则生成的双
将为3.14150000000000181188397618825547397136688232421875,因此无法判断原始数字是什么。计算用户输入中的小数点位数,将其作为字符串读取,查找小数点,并计算其后面的数字字符(如果需要,不包括尾随零)。
问题内容: 我编写了一个小程序来用Java计算Pi。 我的总结目前正在输入中。 我有两个输出,一个是Pi到16个小数位(原始输出)。第二个输出使用/ 舍入到3-5个小数位。 我花了一段时间浏览和浏览Stackoverflow,但是作为一个初学者,我不确定找到所需的正确方法所需要的任何内容,所以请原谅我。 是否可以计算出超过16个小数位的答案(即Pi)?说32岁?如果是这样,我该如何处理? 我已经看
我在C#中尝试了这一点,结果是正确的。
本文向大家介绍R语言 小数点位数的设置方式,包括了R语言 小数点位数的设置方式的使用技巧和注意事项,需要的朋友参考一下 经常用数据分析,有时不同的文件的小数位数不一样,但是我们可以让它们的位数保持一致的,下面的介绍就是设置小数位数。 使用options函数 默认为7位 下面开始设置下 看最大的位数 从上面知道,最多是22位的,下面来实验下。 是的,它的最大位数是22位。 补充:R语言保留小数点后几
问题内容: 应该很容易。我本来是用javascript来做的,但是在设置我的处理程序页面中的表单之前必须先做。无论如何,我需要使这些值具有2个小数位。Ex 219333.5888888必须为219333.58。有修剪功能或其他功能吗? 问题答案: 这是格式化十进制值的简单示例
我正在尝试在旁边使用值方法。 不幸的是,编译器说不兼容的类型。 如果我将s更改为s,它仍然不喜欢它。
我想返回一个小数点后有2位的双倍(即123.00)。以下是部分代码。输出始终为123.0。如何得到小数点后两位?