android动画sin cos,Android开发中计算器的sin、cos及tan值计算问题分析
本文实例讲述了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值计算问题分析相关推荐
- java中计算器算cos值,Android开发中计算器的sin、cos及tan值计算问题分析
本文实例讲述了Android开发中计算器的sin.cos及tan值计算问题.分享给大家供大家参考,具体如下: 接到一个需求 :要求计算器sin90=1,拿到知道很疑问 难道不等于一么?测试了四五个手机 ...
- android动画送礼物,Android开发仿映客送礼物效果
这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? ...
- android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构
原标题:前端开发中,使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集.它秉承触控优先的设计理念,在全球率先支持AngularJS,并提供性能卓越 ...
- android 动画之漂移,Android之自定义Drawable实现灵动的红鲤鱼动画(上篇)
此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图: 由于整个绘制分析过程比较繁琐所以灵动的红鲤鱼 ...
- android 动画引擎,用 Android 实现一条小金鱼游动动画(超棒)
此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图: 用 Android 实现一条小金鱼游动动画( ...
- Android动画学习笔记-Android Animation
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...
- android动画延迟执行,Android 过渡动画框架
为了帮助视图层次内部和视图之间的过渡更加容易实现动画效果,Android 提供了 Transition 框架.这一套框架能够在视图之间提供一种或者多种动画过渡效果.过渡动画要解决的另一个主要问题就是对 ...
- android动画效果 translate,Android利用translate、scale、alpha、rotate实现动画效果
Android利用translate.scale.alpha.rotate实现动画效果 在Android中可以用animation实现动画效果,Android中的animation由四种类型组成: a ...
- android动画送礼物,Android仿直播类app赠送礼物功能
直播界面 实现的是播放本地的视频文件: /** * 直播界面,用于对接直播功能 */ public class LiveFrag extends Fragment { private ImageVie ...
最新文章
- python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型
- java中实现将十六进制按位取反
- DCMTK:DcmSpecificCharacterSet类的测试程序
- 静态与非静态(转改)
- [react-router] react的路由和普通路由有什么区别?
- vue-router 路由嵌套显示不出来_网络协议|OSI模型第三层网络层中的路由
- android 判断fragment类型,Android 判断当前Fragment是否可见(Visible)
- hdu 1861 游船出租 tag:模拟
- 对程序员来说最难的是写代码吗?
- 计算机组成原理mw,计算机组成原理 存储器
- Java基础IO流 韩顺平Java笔记
- 洛谷P3853 路标设置
- IP雷达4.0+网络检测
- Cadence16.6 最新83号补丁下载-Hotfix_SPB16.60.083_wint_1of1.exe
- 弗兰克(最少五个字)
- linux防ddos攻击脚本,Linux IPTables防DDOS攻击Shell脚本
- sql注入登陆(菜鸟级)
- 东华大学计算机学院迎新晚会,第五届东华大学研究生才艺之星暨校研会迎新晚会圆满结束...
- TTE系统容错设计(1) ——集中守护机制
- 安晴同学|大榕树下的友谊