中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發中如何解決計算器的sin、cos及tan值計算問題

發布時間:2021-08-06 14:30:54 來源:億速云 閱讀:138 作者:小新 欄目:移動開發

小編給大家分享一下Android開發中如何解決計算器的sin、cos及tan值計算問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

具體如下:

接到一個需求 :要求計算器sin90=1,拿到知道很疑問 難道不等于一么?測試了四五個手機 ,有的滿足,有的sin90=0.8939…。查了api文檔后發現 jdk中Math.sin/cos/tan ()求值采用弧度值,目前覺大部分手機計算器 如果滿足sin(90)=1就不會滿足sin(pi/2)=1,因為其算法如果轉換弧度值(x/180*pi).當輸入弧度值算時會變為sin(弧度值/180*pi)使結果錯誤。實現計算器算法使可分sin中是否含pi來進行不同的處理

我的解決辦法如下:

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

部分源代碼:

輸入的算式經過這個方法傳入,然后轉過另一個類求出計算值,該類在位置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*”

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

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了!

看完了這篇文章,相信你對“Android開發中如何解決計算器的sin、cos及tan值計算問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巢湖市| 霸州市| 镇安县| 右玉县| 呼图壁县| 青海省| 安福县| 开阳县| 来宾市| 锡林郭勒盟| 汕尾市| 镇巴县| 方山县| 林口县| 封开县| 张家口市| 新蔡县| 营口市| 梓潼县| 高雄市| 宁武县| 长治县| 拉萨市| 伊金霍洛旗| 云霄县| 班戈县| 邛崃市| 龙口市| 昔阳县| 康马县| 周宁县| 金山区| 通渭县| 玛沁县| 麻江县| 如皋市| 津市市| 西贡区| 辽宁省| 廉江市| 巴中市|