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:

<span style="font-size:18px;">package com.android.calculator2;

<span style="color:#ff0000;">import java.util.Locale;//added </span>
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;

    <span style="color:#ff0000;">private static final String NAN      = "NaN";//added</span>
    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.
            	<span style="color:#ff0000;">/*add*/
            	String strResult = "";
                for (int precision = MAX_DIGITS; precision > 6; precision--) {
                	strResult = tryFormattingWithPrecision(result, precision);
                    if (strResult.length() <= MAX_DIGITS) {
                        break;
                    }
                }
                /*end*/</span>
              <span style="color:#ff0000;">  final String resultString = mTokenizer.getLocalizedExpression(
                        /*Util.doubleToString(result, MAX_DIGITS, ROUNDING_DIGITS)*/strResult);//modified</span>
                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);
    }</span>
<span style="font-size:18px;">
<span style="color:#ff0000;">    /*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*/</span>
}</span>
时间: 2024-09-30 15:07:04

Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法的相关文章

Django链接Mysql 8.0 出现错误(1045:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO) 的一种解决方法

运行环境: Django版本2.0 ; Mysql 版本 8.0.11; 错误代码:  django.db.utils.OperationalError: (1045:Access denied for user 'root'@'localhost' (using password: NO) 这个错误看网上的说法基本都是由于 数据库的 用户名 和 密码 不正确导致的 ,下面是我在Django Setting.py里的设置: ``` DATABASES = { 'default': { 'ENGI

未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的解决方法

本人菜鸟一个,在编码过程中遇到的问题记录下以备忘,高手别笑.最近在做一个项目,公司的VS版本是2010,家里的VS版本是2012.把公司的项目用2012打开后再用2010打开就出现 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的提示,软件的界面无法显示.网上找了些解决方法,有的可能要重装VS什么的,在麻烦了. 我用VS 2010打开后先清理项目再生成项目,重新打开没有上面的提示了,界面也可以显示.

java用double和float进行小数计算精度不准确

java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非常严重的. <Effective Java>中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,java的设计者给编程人员提供了一个很有用的类BigDecim

全功能HTRI 7.0换热器计算软件

全功能HTRI 7.0换热器计算软件 HTRI.Xchanger.suite.V6.00换热器计算    能够对圆筒炉和方箱炉的性能进行模拟计算. Xfh 使用Hottel的区域法来计算加热炉各部位的热辐射和工艺侧的性能.与内含的燃烧室和对流室模型一起能够对燃烧式加热炉进行全面的性能评价.能够对板框式换热器进行设计, 核算和模拟计算, 可以使用自定义板型或者内置的制造厂数据库内的板型:Xist 支持包括所有的标准TEMA类型的计算,并且集成了流动导致的震动计算, 管子排布工具等等.进行空冷器和经

计算阶乘n!末尾所含的0的个数

问题描述 给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数. 例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 问题分析: 显然,对于阶乘增长速度的非常快的,很容易就溢出了.当然就不可能把阶乘算出来,而是要找规律解决.下面用因式分解的思路来考虑:末尾的0可以分解为2*

解决方法:64位系统-未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

原文:解决方法:64位系统-未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"提供程序 win7或win8 64位下调试程序,出现这样的错误提示:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序 解决方法如下: 方法一:“设置应用程序池默认属性”/“常规”/”启用32位应用程序”,设置为 true. 如下图所示: 方法二:生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X

解决方法:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

win7或win8 64位调试程序,出现这样的错误提示:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序 解决方法如下: 方法一:“设置应用程序池默认属性”/“常规”/”启用32位应用程序”,设置为 true. 如下图所示: 方法二:生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86. 如下图所示:

Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 解决方法

环境:windows server 2008r2 64位  IIS access 2003 问题:Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 解决方法:网上找的 在Windows 7(32位)用.Net开发的Excel导入数据表功能,测试后一切正常,站点发布挪到Windows Server 2008(64位)上就意外了,出现错误提示,运行程序,抛出异常:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩