Android开发中计算器的sin、cos及tan值计算问题分析

作者:angel鹿 时间:2023-11-11 08:21:40 

本文实例讲述了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了!

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

希望本文所述对大家Android程序设计有所帮助。

来源:http://blog.csdn.net/qq_31012033/article/details/52301715

标签:Android,计算器
0
投稿

猜你喜欢

  • 自己实现Android View布局流程

    2022-07-10 22:20:26
  • java中gc算法实例用法

    2022-10-15 23:19:55
  • Java8内存模型PermGen Metaspace实例解析

    2023-11-25 10:53:36
  • java实现图片分割指定大小

    2021-07-02 16:56:34
  • Spring Bean初始化及销毁多种实现方式

    2023-06-10 13:14:01
  • Android编程实现将应用强制安装到手机内存的方法

    2022-09-09 23:02:08
  • 海量数据去重排序bitmap(位图法)在java中实现的两种方法

    2022-10-10 17:27:36
  • Java应用开源框架实现简易web搜索引擎

    2023-08-22 20:20:54
  • Spring自动注入失败的解决方法

    2022-08-13 03:41:31
  • Java Swing实现JTable检测单元格数据变更事件的方法示例

    2022-10-16 19:49:29
  • 分布式系统下调用链追踪技术面试题

    2023-11-25 05:55:00
  • spring boot 实现配置多个DispatcherServlet最简单方式

    2023-12-18 03:24:46
  • Android实现图片添加阴影效果的2种方法

    2022-10-31 06:46:55
  • Android实现图片缓存与异步加载

    2022-02-25 14:21:06
  • 详解Java中Math.round()的取整规则

    2022-10-20 14:22:01
  • Mybatis-Plus分页的使用与注意事项

    2022-08-14 22:00:56
  • java使用dom4j生成与解析xml文档的方法示例

    2022-06-18 23:41:56
  • Java内部类及其特点的讲解

    2023-06-09 19:39:41
  • .NET垃圾回收器(GC)原理浅析

    2023-11-24 13:50:56
  • Unity3D实现控制摄像机移动

    2022-06-23 20:44:04
  • asp之家 软件编程 m.aspxhome.com