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’没有省略的解决方法...相关推荐

  1. IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法

    IIS6.0发布后对路径"D:\xxx\xxxx\web.config"的访问被拒绝问题的解决方法 参考文章: (1)IIS6.0发布后对路径"D:\xxx\xxxx\w ...

  2. mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法)

    mysql8.0.18ZIP版下载与安装(以及无my-default.ini文件和data文件夹的解决方法) 参考文章: (1)mysql8.0.18ZIP版下载与安装(以及无my-default.i ...

  3. 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) 的一种解决方法 参 ...

  4. 最近用360浏览器访问部分网站显示 se://error/ 打不开网站,但是用别的浏览器可以正常访问,摸索半天放出解决方法

    最近用360浏览器访问部分网站显示 se://error/ 打不开网站,但是用别的浏览器可以正常访问,摸索半天放出解决方法. 360浏览器访问带有个https://的网站,比如https://www. ...

  5. android字体显示不全,android 按钮的文字显示不全

    android 按钮的文字显示不全 发布时间:2020-06-19 03:42:34 来源:51CTO 阅读:1424 作者:FergusJ AbsoluteLayout.LayoutParams l ...

  6. android 分辨率显示不全,安卓手机分辨率太高软件显示不全?任意软件全屏运行详细教程...

    手机分辨率太高软件显示不全?教你瞬间让任意软件变全屏 如果你像白鸽一样使用高分辨率的安卓手机(比如Atrix 4G)或是平板电脑,就会发现很多软件居然不能全屏显示.面对这样的问题,传统的解决办法无外乎 ...

  7. 魅族显示无法连接到服务器,魅族连接电脑无法识别怎么办_魅族手机usb无法连接电脑的解决方法...

    最近有位朋友向小编反映说自己刚买了一台魅族手机,可是在用它连接电脑的时候却一直无法识,别连不上电脑,不知道怎么回事.那么魅族连接电脑无法识别怎么办呢?小编就针对这个问题,给大家带来魅族手机usb无法连 ...

  8. android荣耀不弹出获取权限提醒,荣耀手机怎么设置锁屏消息提示?附不提示的解决方法...

    荣耀手机怎么设置锁屏消息提示?附不提示的解决方法.今天新机汇要来为大家分享一下荣耀手机的锁屏消息设置提醒,这样其实也是为了方便接收消息,不过有的用户在来了消息的情况下,在锁屏状态下并不会提醒,那么这是 ...

  9. 迅雷显示服务器未连接,迅雷看看网络连接不上怎么回事 迅雷看看连接不上网络的解决方法...

    当我们在使用迅雷下载视频,很多用户都会使用迅雷中的边播边放功能,一般情况下只要网速正常是可以正常播放的,但是很多用户在显示出迅雷看看之后就出现网络连接不上的问题,这是怎么回事呢?如何解决?相信有很多的 ...

最新文章

  1. 15 redis-分布式锁
  2. java用重载实现获取元素的数据类型
  3. 六耳猕猴并不存在,真假猴王的六耳原来是他!
  4. 卷积神经网络(CNN)详解及TensorFlow2代码实现
  5. linux基础:7、基础命令介绍(2)
  6. 修改端口_如何修改服务器的远程端口
  7. Python学习笔记(语句)
  8. (void __user *)arg 中__user的作用
  9. JAVA实现SHA256算法
  10. 青岛海洋超级计算机,青岛海洋科学与技术试点国家实验室
  11. Xshell7 和 Xftp7 免费下载安装
  12. 拿到offer后 还应该继续去面试?
  13. 众多尼龙VRay材质球素材一键即可获取
  14. 如何预防 CSRF 攻击
  15. Netron 模型可视化神器,保存好的模型丢进去就能可视化!
  16. 编程基础——鱼龙混杂来两波
  17. spring的 init-method和 destory-method方法
  18. 机器学习模型训练测试完整步骤
  19. 【金猿案例展】FPD领域龙头企业某T社——基于ADC的智能质检服务
  20. matlab 2016b vs2010,在Matlab2010b中调用 Microsoft Visual C++ 2010

热门文章

  1. 秒杀(PHP,Redis,Lua)
  2. 天马行空脚踏实地,阿里巴巴有群百里挑一的天才应届生
  3. 走进JavaScript响应式编程(Reactive Programming)
  4. PowerShell针对SCVMM批量导出模板的描述信息以及导入
  5. Exchange 2007 配置POP3
  6. ZOUNDRY TEST
  7. php 当地天气预报,PHP实现采集中国天气网未来7天天气
  8. vb初学者编程代码大全_学习VB编程第14天,一个简单的排序代码把我难住了
  9. 调用父级方法_通信:找到任意组件实例的findComponents系列方法,5个终极方案
  10. git stash pop_git常用命令行背诵并默写(全)