android 计算器显示不全,Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法...
Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略
一、问题的描述:
【测试步骤】
1.进入计算器
2.输入 100-99.9
3.查看计算结果
【测试结果】
1.结果为: 0.0999999999
【预期结果】
1.结果应为: 0.1
【测试步骤】
1.进入计算器
2.输入1000-999.9,查看结果是否为: 0.1
【测试结果】
1.结果显示为: 0.10000000
【预期结果】
1.计算结果小数点后多余的零应该省略。
二、解决方案:path:
package com.android.calculator2;
import java.util.Locale;//added
import org.javia.arity.Symbols;
import org.javia.arity.SyntaxException;
import org.javia.arity.Util;
public class CalculatorExpressionEvaluator {
private static final int MAX_DIGITS = 12;
private static final int ROUNDING_DIGITS = 2;
private final Symbols mSymbols;
private final CalculatorExpressionTokenizer mTokenizer;
private static final String NAN = "NaN";//added
public CalculatorExpressionEvaluator(CalculatorExpressionTokenizer tokenizer) {
mSymbols = new Symbols();
mTokenizer = tokenizer;
}
public void evaluate(CharSequence expr, EvaluateCallback callback) {
evaluate(expr.toString(), callback);
}
public void evaluate(String expr, EvaluateCallback callback) {
expr = mTokenizer.getNormalizedExpression(expr);
// remove any trailing operators
while (expr.length() > 0 && "+-/*".indexOf(expr.charAt(expr.length() - 1)) != -1) {
expr = expr.substring(0, expr.length() - 1);
}
try {
if (expr.length() == 0 || Double.valueOf(expr) != null) {
callback.onEvaluate(expr, null, Calculator.INVALID_RES_ID);
return;
}
} catch (NumberFormatException e) {
// expr is not a simple number
}
try {
double result = mSymbols.eval(expr);
if (Double.isNaN(result)) {
callback.onEvaluate(expr, null, R.string.error_nan);
} else {
// The arity library uses floating point arithmetic when evaluating the expression
// leading to precision errors in the result. The method doubleToString hides these
// errors; rounding the result by dropping N digits of precision.
/*add*/
String strResult = "";
for (int precision = MAX_DIGITS; precision > 6; precision--) {
strResult = tryFormattingWithPrecision(result, precision);
if (strResult.length() <= MAX_DIGITS) {
break;
}
}
/*end*/
final String resultString = mTokenizer.getLocalizedExpression(
/*Util.doubleToString(result, MAX_DIGITS, ROUNDING_DIGITS)*/strResult);//modified
callback.onEvaluate(expr, resultString, Calculator.INVALID_RES_ID);
}
} catch (SyntaxException e) {
callback.onEvaluate(expr, null, R.string.error_syntax);
}
}
public interface EvaluateCallback {
public void onEvaluate(String expr, String result, int errorResourceId);
}
/*added*/
private String tryFormattingWithPrecision(double value, int precision) {
// The standard scientific formatter is basically what we need. We will
// start with what it produces and then massage it a bit.
String result = String.format(Locale.US, "%" + MAX_DIGITS + "." + precision + "g", value);
if (result.equals(NAN)) { // treat NaN as Error
return "NAN";
}
String mantissa = result;
String exponent = null;
int e = result.indexOf('e');
if (e != -1) {
mantissa = result.substring(0, e);
// Strip "+" and unnecessary 0's from the exponent
exponent = result.substring(e + 1);
if (exponent.startsWith("+")) {
exponent = exponent.substring(1);
}
exponent = String.valueOf(Integer.parseInt(exponent));
} else {
mantissa = result;
}
int period = mantissa.indexOf('.');
if (period == -1) {
period = mantissa.indexOf(',');
}
if (period != -1) {
// Strip trailing 0's
while (mantissa.length() > 0 && mantissa.endsWith("0")) {
mantissa = mantissa.substring(0, mantissa.length() - 1);
}
if (mantissa.length() == period + 1) {
mantissa = mantissa.substring(0, mantissa.length() - 1);
}
}
if (exponent != null) {
result = mantissa + 'e' + exponent;
} else {
result = mantissa;
}
return result;
}
/*end*/
}
原文:http://blog.csdn.net/lisineng/article/details/45191689
android 计算器显示不全,Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法...相关推荐
- IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法
IIS6.0发布后对路径"D:\xxx\xxxx\web.config"的访问被拒绝问题的解决方法 参考文章: (1)IIS6.0发布后对路径"D:\xxx\xxxx\w ...
- mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)
mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法) 参考文章: (1)mysql8.0.18ZIP版下载与安装(以及无my-default.i ...
- Django链接Mysql 8.0 出现错误(1045:Access denied for user ‘root‘@‘localhost‘ (using password: NO) 的一种解决方法
Django链接Mysql 8.0 出现错误(1045:Access denied for user 'root'@'localhost' (using password: NO) 的一种解决方法 参 ...
- 最近用360浏览器访问部分网站显示 se://error/ 打不开网站,但是用别的浏览器可以正常访问,摸索半天放出解决方法
最近用360浏览器访问部分网站显示 se://error/ 打不开网站,但是用别的浏览器可以正常访问,摸索半天放出解决方法. 360浏览器访问带有个https://的网站,比如https://www. ...
- android字体显示不全,android 按钮的文字显示不全
android 按钮的文字显示不全 发布时间:2020-06-19 03:42:34 来源:51CTO 阅读:1424 作者:FergusJ AbsoluteLayout.LayoutParams l ...
- android 分辨率显示不全,安卓手机分辨率太高软件显示不全?任意软件全屏运行详细教程...
手机分辨率太高软件显示不全?教你瞬间让任意软件变全屏 如果你像白鸽一样使用高分辨率的安卓手机(比如Atrix 4G)或是平板电脑,就会发现很多软件居然不能全屏显示.面对这样的问题,传统的解决办法无外乎 ...
- 魅族显示无法连接到服务器,魅族连接电脑无法识别怎么办_魅族手机usb无法连接电脑的解决方法...
最近有位朋友向小编反映说自己刚买了一台魅族手机,可是在用它连接电脑的时候却一直无法识,别连不上电脑,不知道怎么回事.那么魅族连接电脑无法识别怎么办呢?小编就针对这个问题,给大家带来魅族手机usb无法连 ...
- android荣耀不弹出获取权限提醒,荣耀手机怎么设置锁屏消息提示?附不提示的解决方法...
荣耀手机怎么设置锁屏消息提示?附不提示的解决方法.今天新机汇要来为大家分享一下荣耀手机的锁屏消息设置提醒,这样其实也是为了方便接收消息,不过有的用户在来了消息的情况下,在锁屏状态下并不会提醒,那么这是 ...
- 迅雷显示服务器未连接,迅雷看看网络连接不上怎么回事 迅雷看看连接不上网络的解决方法...
当我们在使用迅雷下载视频,很多用户都会使用迅雷中的边播边放功能,一般情况下只要网速正常是可以正常播放的,但是很多用户在显示出迅雷看看之后就出现网络连接不上的问题,这是怎么回事呢?如何解决?相信有很多的 ...
最新文章
- 15 redis-分布式锁
- java用重载实现获取元素的数据类型
- 六耳猕猴并不存在,真假猴王的六耳原来是他!
- 卷积神经网络(CNN)详解及TensorFlow2代码实现
- linux基础:7、基础命令介绍(2)
- 修改端口_如何修改服务器的远程端口
- Python学习笔记(语句)
- (void __user *)arg 中__user的作用
- JAVA实现SHA256算法
- 青岛海洋超级计算机,青岛海洋科学与技术试点国家实验室
- Xshell7 和 Xftp7 免费下载安装
- 拿到offer后 还应该继续去面试?
- 众多尼龙VRay材质球素材一键即可获取
- 如何预防 CSRF 攻击
- Netron 模型可视化神器,保存好的模型丢进去就能可视化!
- 编程基础——鱼龙混杂来两波
- spring的 init-method和 destory-method方法
- 机器学习模型训练测试完整步骤
- 【金猿案例展】FPD领域龙头企业某T社——基于ADC的智能质检服务
- matlab 2016b vs2010,在Matlab2010b中调用 Microsoft Visual C++ 2010
热门文章
- 秒杀(PHP,Redis,Lua)
- 天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生
- 走进JavaScript响应式编程(Reactive Programming)
- PowerShell针对SCVMM批量导出模板的描述信息以及导入
- Exchange 2007 配置POP3
- ZOUNDRY TEST
- php 当地天气预报,PHP实现采集中国天气网未来7天天气
- vb初学者编程代码大全_学习VB编程第14天,一个简单的排序代码把我难住了
- 调用父级方法_通信:找到任意组件实例的findComponents系列方法,5个终极方案
- git stash pop_git常用命令行背诵并默写(全)