本文实例讲述了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:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

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

android动画sin cos,Android开发中计算器的sin、cos及tan值计算问题分析相关推荐

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

    本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...

  2. android动画送礼物,Android开发仿映客送礼物效果

    这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? ...

  3. android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构

    原标题:前端开发中,使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集.它秉承触控优先的设计理念,在全球率先支持AngularJS,并提供性能卓越 ...

  4. android 动画之漂移,Android之自定义Drawable实现灵动的红鲤鱼动画(上篇)

    此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图: 由于整个绘制分析过程比较繁琐所以灵动的红鲤鱼 ...

  5. android 动画引擎,用 Android 实现一条小金鱼游动动画(超棒)

    此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图: 用 Android 实现一条小金鱼游动动画( ...

  6. Android动画学习笔记-Android Animation

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

  7. android动画延迟执行,Android 过渡动画框架

    为了帮助视图层次内部和视图之间的过渡更加容易实现动画效果,Android 提供了 Transition 框架.这一套框架能够在视图之间提供一种或者多种动画过渡效果.过渡动画要解决的另一个主要问题就是对 ...

  8. android动画效果 translate,Android利用translate、scale、alpha、rotate实现动画效果

    Android利用translate.scale.alpha.rotate实现动画效果 在Android中可以用animation实现动画效果,Android中的animation由四种类型组成: a ...

  9. android动画送礼物,Android仿直播类app赠送礼物功能

    直播界面 实现的是播放本地的视频文件: /** * 直播界面,用于对接直播功能 */ public class LiveFrag extends Fragment { private ImageVie ...

最新文章

  1. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型
  2. java中实现将十六进制按位取反
  3. DCMTK:DcmSpecificCharacterSet类的测试程序
  4. 静态与非静态(转改)
  5. [react-router] react的路由和普通路由有什么区别?
  6. vue-router 路由嵌套显示不出来_网络协议|OSI模型第三层网络层中的路由
  7. android 判断fragment类型,Android 判断当前Fragment是否可见(Visible)
  8. hdu 1861 游船出租 tag:模拟
  9. 对程序员来说最难的是写代码吗?
  10. 计算机组成原理mw,计算机组成原理 存储器
  11. Java基础IO流 韩顺平Java笔记
  12. 洛谷P3853 路标设置
  13. IP雷达4.0+网络检测
  14. Cadence16.6 最新83号补丁下载-Hotfix_SPB16.60.083_wint_1of1.exe
  15. 弗兰克(最少五个字)
  16. linux防ddos攻击脚本,Linux IPTables防DDOS攻击Shell脚本
  17. sql注入登陆(菜鸟级)
  18. 东华大学计算机学院迎新晚会,第五届东华大学研究生才艺之星暨校研会迎新晚会圆满结束...
  19. TTE系统容错设计(1) ——集中守护机制
  20. 安晴同学|大榕树下的友谊

热门文章

  1. VA助手,支持vs2019版本
  2. java double数值范围_Java中float和double的取值范围该怎样理解?
  3. android 背景设置正圆,Android图片特效:黑白特效、圆角效果、高斯模糊
  4. HTML+CSS大作业:众志成城 抗击疫情 抗击疫情网页制作作业 疫情防控网页设计
  5. 淘汰纸质巡检,智能化巡检更高效
  6. 禾赛终止IPO,为谁敲响了警钟?
  7. excel 查找两列的共同元素
  8. 安卓屏幕密度(Density)和分辨率的关系
  9. 数据采集+简易分析:(欧洲五大联赛2010--2018)1万5千场球赛的欧盘分析
  10. 校园考勤不再形同虚设