java中不使用解析的字符串-双精度
我需要创建一个将字符串转换为double的程序java中不使用解析的字符串-双精度,java,Java,我需要创建一个将字符串转换为double的程序 public class Convert{ public static void main(String args[]){ String num="124023211.123"; int d=0,g=0,c=0,fnl=0,h=0,v=0; double fnl2=0; int exp=(num.indexOf(".")-1); while(num.charAt(d)!='.'){ g=n
public class Convert{
public static void main(String args[]){
String num="124023211.123";
int d=0,g=0,c=0,fnl=0,h=0,v=0;
double fnl2=0;
int exp=(num.indexOf(".")-1);
while(num.charAt(d)!='.'){
g=num.charAt(d)-48;
int k = 1;
for(int f=0;f<exp;f++){
k=(k*10);
}
fnl+=(k*g);
d++;
exp--;
}
num=(num.substring(d+1) );
//System.out.println(fnl);
//System.out.println(num);
while(h!=num.length()){
v=num.charAt(h)-48;
double j=1;
int exp1=num.length();
for(int f1=0;f1<exp1;f1++){
j*=.10;
}
fnl2+=(h*j);
j++;
h++;
}
System.out.println(fnl2);
}
}
公共类转换{
公共静态void main(字符串参数[]){
字符串num=“124023211.123”;
int d=0,g=0,c=0,fnl=0,h=0,v=0;
双fnl2=0;
int exp=(num.indexOf(“.”)1);
而(数字字符(d)!='。){
g=字符数(d)-48;
int k=1;
对于(int f=0;f
这一行是您的问题的一部分。您的循环将始终循环num.length()次,但num的长度没有变化(因此在您的情况下总是3次)。这导致所有三个数字都被视为千分之一
此外,请记住,十进制值不能以IEEE-754格式精确表示。通过执行所有这些乘法和加法,您的结果中会引入错误。Double.Parse将为您的数字提供最佳近似值。您可以执行以下操作
String s="124023211.123";
int i;
double result = 0.0f, result2 = 0.0f;
for (i = 0; i < s.length(); i++)
if (s.charAt(i) == '.')
break;
else
result = result * 10 + (s.charAt(i) - '0');
for (i = s.length()-1 ; i>=0 ; i--)
if (s.charAt(i) == '.')
break;
else
result2 = result2 / 10 + (s.charAt(i) - '0');
if (i>=0)
result += result2/10;
String s=“124023211.123”;
int i;
双结果=0.0f,结果2=0.0f;
对于(i=0;i=0;i--)
如果(s.charAt(i)='。)
打破
其他的
结果2=结果2/10+(s.charAt(i)-“0”);
如果(i>=0)
结果+=结果2/10;
测试:11,3.0,6.00000,0005.000,12和124023211.123
当然,您不会总是得到准确的值,因为有时它会被写成一个双精度表达式,就像您提供的数字一样。而且有些数字在二进制中没有表示形式。试试这一个,它运行良好,经过有效数据测试
public class Sample1 {
public static void main(String args[]){
String num="122312312.2331231";
String s1 = num.substring(0,num.indexOf("."));
String s2 = num.substring(num.indexOf(".") + 1,num.length());
System.out.println(s1);
System.out.println(s2);
double n1 = 0;
double n2 = 0;
for(int i=0;i<s1.length();i++){
double d = s1.charAt(i) - '0';
n1 = n1*10;
n1 += d;
}
System.out.println(n1);
for(int i=0;i<s2.length();i++){
double d = s2.charAt(i) - '0';
//n2 = n2/;
n2 += d/number(i+1);
}
System.out.println(n1+n2);
}
public static long number(int n2){
long d = 10l;
if(n2>1)
d = 10 * number(n2-1);
return d;
}
}
公共类样本1{
公共静态void main(字符串参数[]){
字符串num=“12231231232.2331231”;
字符串s1=num.substring(0,num.indexOf(“.”);
字符串s2=num.substring(num.indexOf(“.”+1,num.length());
系统输出打印LN(s1);
系统输出打印LN(s2);
双n1=0;
双n2=0;
对于(int i=0;我认为您不允许使用String.valueOf
或Double.parseDouble
?您的方法仍然是解析:)我很想帮助你,但是你的代码很难理解,所有的d,g,c,h,v…这些变量是干什么的?我会坚持我的观点,一个好的代码格式和一个好的变量命名对于其他想要阅读你的代码的程序员来说是百倍的时间节省…你所说的“双结果到巨大的十进制数”是什么意思?如果你的意思是你得到了类似“.003000000001”的东西在小数点的右边,这是意料之中的,因为浮点数并不精确。但您的算法至少还有三个其他错误。我建议您使用已经开始查找错误的程序,因为否则您就在正确的轨道上。使用调试器或放入一些System.out.println
在代码中显示如何生成结果。顺便说一句……除非我遗漏了什么,否则您的代码中不是遗漏了什么吗?这应该是Java还是Python?;)它是Java,经过测试的!@user2768260我在开玩笑说没有花括号。嘿,Jon Skeet说你应该一直使用花括号,他在这里被认为是上帝:你不会和Jon Skeet争论的,是吗?:)请再给我一次例子。它只适用于负数。如果你想它适用于负数,我可以为你编辑它。
public class Sample1 {
public static void main(String args[]){
String num="122312312.2331231";
String s1 = num.substring(0,num.indexOf("."));
String s2 = num.substring(num.indexOf(".") + 1,num.length());
System.out.println(s1);
System.out.println(s2);
double n1 = 0;
double n2 = 0;
for(int i=0;i<s1.length();i++){
double d = s1.charAt(i) - '0';
n1 = n1*10;
n1 += d;
}
System.out.println(n1);
for(int i=0;i<s2.length();i++){
double d = s2.charAt(i) - '0';
//n2 = n2/;
n2 += d/number(i+1);
}
System.out.println(n1+n2);
}
public static long number(int n2){
long d = 10l;
if(n2>1)
d = 10 * number(n2-1);
return d;
}
}