解决方案 »
- 请教高手, 不同JDK下Locale.getDefault()不同结果。
- 关于TCP方式socket的多线程
- eclipse中如何设置每个java文件上面的作者,日期等说明?
- 想在Jpanel上实现鼠标的拖放,请教请教
- (分已给完,友情帮助...)关闭多个frame,和多个frame显示(好心人帮帮忙)
- Application 改为Applet步骤几个???接分!!
- 新手提问,谢谢!!!
- 哪位兄弟帮个忙,送300分~
- 一个伟大的计划..为JDK的每个class写一个小例子,方便初学者...
- 请教,jdbc的连接串中怎么带上sqlserver的实例名称?(急死我了)
- 使用键盘画直线
- 比较对象大小== ,equals
还有将具体的异常信息贴出来,异常信息中会指出异常的原因
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
temp = chuLing(temp);
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));我保证left、right是正确的 而且 Double.parseDouble(left)*Double.parseDouble(right) 这一步是能计算的(我断点调试试出来的),而且能计算正确
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c == '*')
return 100+i+1;
else
{
if (c == '/')
return 200+1+i;
}
}
return 0;
}
private int find_JiaAndJian(String s)
{
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (c == '+')
return 300+i+1;
else
{
if ((c == '-') && i != 0 && (s.charAt(i - 1) >= '0'&&s.charAt(i - 1) <= '9'))
return 400+i+1;
}
}
return 0;
}
private String find_Left(String s)
{
int n = 0;
for (int i = s.length()-1; i >= 0; i--)
{
char c = s.charAt(i);
if ((c >= '0'&&c <= '9')||c =='.' || i == 0)
n++;
else
break;
}
return s.substring(s.length()-n);
} private String find_Right(String s)
{
int n = 0;
for (int i =0; i<s.length(); i++)
{
char c = s.charAt(i);
if ((c >= '0'&&c <= '9') || c == '.'|| i ==0)
n++;
else
break;
}
return s.substring(0,n);
}
private String chuLing(String s)
{
if (Double.parseDouble(s) - Integer.parseInt(s) == 0)
s = String.valueOf(Integer.parseInt(s));
else
{
int n = 0;
for (int i = s.length() - 1; i >= 0; i--)
{
char c = s.charAt(i);
if (c == '0')
n++;
else
break;
}
s = s.substring(0,s.length() - n).toString();
}
return s;
}
private String jiSuan(String s) {
//if 处理括号问题
if (s.indexOf(')') + 1 != 0)
{
//核心就是找出配对括号,将 字符串中“ (算式)”替换乘算式的结果
//循环调用,最终变成一个无括号的字符串算式
//最后再计算这个无括号的字符串算式,就能返回一个字符串类型的结果
for (int right = s.indexOf(')') + 1 ; right > 0; )
{
int left = s.substring(0,right - 1).toString().lastIndexOf('(') + 1;
String sLeft = s.substring(0,left - 1).toString();
String sRight = s.substring(right);
s = sLeft + jiSuan(s.substring(0,right - 1).toString().substring(left)) + sRight;
}
return jiSuan(s);
}
// else 做四则运算
else
{
//思路:先找到运算符,再找这个运算符的两个操作数
// 计算,返回 “将原字符串中 此次运算的算式 替换为 运算结果” 的字符串
//乘除运算
for (int i = find_ChengAndChu(s);i>0 ;)
{
int = i / 100;
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where).toString());
String temp = "";
if ( == 1)
{
temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
temp = chuLing(temp);
}
if ( == 2)
{
if(Double.parseDouble(right) == 0) {
throw new ArithmeticException();
}
else {
temp = String.valueOf(Double.parseDouble(left)/Double.parseDouble(right));
temp = chuLing(temp);
}
}
s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
i = find_ChengAndChu(s);
} //加减运算
for (int i = find_JiaAndJian(s); i>0;)
{
int = i / 100;
int where = i % 100;
String left = find_Left(s.substring(0,where - 1).toString());
String right = find_Right(s.substring(where));
String temp = "";
if ( == 3)
{
temp = String.valueOf(Double.parseDouble(left) + Double.parseDouble(right));
temp = chuLing(temp);
}
if ( == 4)
{
temp = String.valueOf(Double.parseDouble(left) - Double.parseDouble(right));
temp = chuLing(temp);
}
s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
i = find_JiaAndJian(s);
}
return s;
}
}
或者两个值乘积比double类型上限还大