最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā)中計算器的sin、cos及tan值計算問題分析

 更新時間:2017年11月15日 14:23:47   作者:angel鹿  
這篇文章主要介紹了Android開發(fā)中計算器的sin、cos及tan值計算問題,結(jié)合實(shí)例形式分析了Android三角函數(shù)運(yùn)算中的弧度與角度計算問題與相關(guān)解決方法,需要的朋友可以參考下

本文實(shí)例講述了Android開發(fā)中計算器的sin、cos及tan值計算問題。分享給大家供大家參考,具體如下:

接到一個需求 :要求計算器sin90=1,拿到知道很疑問 難道不等于一么?測試了四五個手機(jī) ,有的滿足,有的sin90=0.8939…。查了api文檔后發(fā)現(xiàn) jdk中Math.sin/cos/tan ()求值采用弧度值,目前覺大部分手機(jī)計算器 如果滿足sin(90)=1就不會滿足sin(pi/2)=1,因?yàn)槠渌惴ㄈ绻D(zhuǎn)換弧度值(x/180*pi).當(dāng)輸入弧度值算時會變?yōu)閟in(弧度值/180*pi)使結(jié)果錯誤。實(shí)現(xiàn)計算器算法使可分sin中是否含pi來進(jìn)行不同的處理

我的解決辦法如下:

修改代碼途徑
\packages\apps\Calculator\src\com\android\calculator\CalculatorExpressionEvaluator.java

部分源代碼:

輸入的算式經(jīng)過這個方法傳入,然后轉(zhuǎn)過另一個類求出計算值,該類在位置org.javia.arity.Symbols;(被封裝打不開,只能修改代入值)

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
    }*/
    if (expr.length() == 0) {
    callback.onEvaluate(expr, null, Calculator.INVALID_RES_ID);
    return;
    }
    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.*/
        final String resultString = mTokenizer.getLocalizedExpression(
            Util.doubleToString(result, MAX_DIGITS, ROUNDING_DIGITS));
        callback.onEvaluate(expr, resultString, Calculator.INVALID_RES_ID);
      }
    } catch (SyntaxException e) {
      callback.onEvaluate(expr, null, R.string.error_syntax);
    }
}

我的解決思路是:

斷某該字符串是否含有”sin( ” ,” cos( ” ,”tan(”字符,并且不含“sin(pi”,“cos(pi”,“tan(pi”, 如果有,在每個該字符后面添加字符串”pi/180*”

所以我在代入前加了一個正則表達(dá)式過濾

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
    }*/
    if (expr.length() == 0) {
    callback.onEvaluate(expr, null, Calculator.INVALID_RES_ID);
    return;
    }
    try {
      /**************   添加的過濾代碼  ***********/
      expr=expr.replaceAll("(?<=(sin|cos|tan)[(])(?!pi)","pi/180*");
      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.*/
        final String resultString = mTokenizer.getLocalizedExpression(
            Util.doubleToString(result, MAX_DIGITS, ROUNDING_DIGITS));
        callback.onEvaluate(expr, resultString, Calculator.INVALID_RES_ID);
      }
    } catch (SyntaxException e) {
      callback.onEvaluate(expr, null, R.string.error_syntax);
    }
}

然后就能滿足sin90=1了!

PS:這里再為大家推薦幾款計算工具供大家進(jìn)一步參考借鑒:

在線一元函數(shù)(方程)求解計算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科學(xué)計算器在線使用_高級計算器在線計算:
http://tools.jb51.net/jisuanqi/jsqkexue

在線計算器_標(biāo)準(zhǔn)計算器:
http://tools.jb51.net/jisuanqi/jsq

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

最新評論

女性| 中江县| 三原县| 怀集县| 两当县| 吉首市| 清水河县| 库伦旗| 红桥区| 东兴市| 瓦房店市| 辽阳市| 天峨县| 武威市| 汝南县| 平山县| 株洲市| 清远市| 锦屏县| 东丽区| 平阳县| 靖安县| 孝义市| 邵阳县| 胶南市| 嵊泗县| 舒城县| 青浦区| 清流县| 长海县| 迁安市| 琼海市| 来安县| 文化| 静安区| 兰考县| 舒兰市| 红桥区| 桑日县| 芜湖市| 江孜县|