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

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

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

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

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

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

(0)

相关推荐

  • 从零开始学android实现计算器功能示例分享(计算器源码)

    下面是效果展示: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match

  • android计算器代码示例分享

    复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><EditText    android:id="@+id/editText1"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:ems="10&quo

  • 简单实现Android计算器功能

    自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后复制粘贴覆盖掉这个工程根目录里面的路径文件,再导入工程应该就可以打开了.  安卓计算器Android <wbr>calculator 工程下载链接:https://github.com/jiangxh1992/Android-Calculator 代码: package com.example.c

  • android计算器简单实现代码

    本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下 java代码: package com.itheima74.simplecalculator4; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; imp

  • Android实战教程第一篇之最简单的计算器

    从今天开始,本专栏持续更新Android简易实战类博客文章.和以往专栏不同,此专栏只有实例.每个实例尽量按照知识点对应相应一章节的内容去写,循序渐进.有些实例可能会与另一个专栏有重复的文章. 开始本专栏的第一个简易案例: 首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: <?xml version="1.0" encoding=&quo

  • Android计算器简单逻辑实现实例分享

    引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟了,但是时间有限,只完成了这个简单的计算器. 至于,这个Android的布局已经在我博客中发布了,不再讲述. 复制代码 代码如下: package com.example.androidlessontwo; import android.os.Bundle;import android.app.Activity;import and

  • Android中使用GridLayout网格布局来制作简单的计算器App

    关于GridLayout 在android4.0版本之前,如果想要达到网格布局的效果,首先可以考虑使用最常见的LinearLayout布局,但是这样的排布会产生如下几点问题: 1.不能同时在X,Y轴方向上进行控件的对齐. 2.当多层布局嵌套时会有性能问题. 3.不能稳定地支持一些支持自由编辑布局的工具. 其次考虑使用表格布局TabelLayout,这种方式会把包含的元素以行和列的形式进行排列,每行为一个TableRow对象,也可以是一个View对象,而在TableRow中还可以继续添加其他的控件

  • Android计算器编写代码

    其实这个安卓计算机,所有的后台思想与<C#计算器编写代码>是一模一样的.Win窗体程序移植到安卓,从C#到Java其实很简单的,因为两者的基本语法都很相像,唯一的难点是安卓的xml布局部分,不像C#窗体能够直接拖.  还是如下图一个能够完成基本四则运算的计算器: 先在res\values\strings.xml设置按钮相应的字体,以免布局文件警告满天飞: <?xml version="1.0" encoding="utf-8"?> <r

  • android计时器,时间计算器的实现方法

    需求:默认为"00:00:00",点击开始按钮时清零后开始计时,出现如10:28:34.点击停止的时候停止计时.问题:使用Calendar DateFormat的方法,不设置时区获取到的小时是本地时区的(东八区的就是8),设置成GMT标准时区获取到的时间是12小时(12:00:00),设置24小时制无效.在开始时间加减各种小时都无效,而且计时只能到12小时就自动跳上去了,始终无法出现默认状态00:00:00开始计时的效果.尝试各种时间设置方法无效后只能自己写一个根据秒数转换时间格式字符

  • 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(弧度值/1

  • Android开发中日期工具类DateUtil完整实例

    本文实例讲述了Android开发中日期工具类DateUtil.分享给大家供大家参考,具体如下: /** * 日期操作工具类. * @Project ERPForAndroid * @Package com.ymerp.android.tools * @author chenlin * @version 1.0 */ @SuppressLint("SimpleDateFormat") public class DateUtil { private static final String

  • Android开发中的单例模式应用详解

    本文实例讲述了Android开发中的单例模式应用.分享给大家供大家参考,具体如下: 单例模式是应用最广的设计模式之一,在应用这种模式的时候,单例对象的类必须保证只有一个实例存在.许多时候,整个系统只需要拥有一个全局对象,这样有利于协调系统的整体行为.如一个应用中,应该只有ImageLoader实例,这个ImageLoader实例中又包含网络请求.缓存系统.线程池等,很耗资源,因此没有理由让他构造多个实例.这种不能自由构造对象的情况就是使用单例模式的场景.在Android系统中存在很多这种场景,比

  • Android开发之计算器GridLayout布局实现方法示例

    本文实例讲述了Android开发之计算器GridLayout布局实现方法.分享给大家供大家参考,具体如下: 运行效果: Demo 下载地址:https://github.com/LonglyWolf/Calculator 或者点击此处本站下载. 按钮布局实现: 一个Linearlayout 嵌套三个TextView 最下方的显示当前计算式.上面为先前的计算式. Gridview 网格布局排布按钮 <?xml version="1.0" encoding="utf-8&q

  • Android开发简单计算器实现代码

    计算器项目,要求实现加.减.乘.除.求倒数.求平方根等简单运算. 真机调试结果如下图: 布局文件:main_activity.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare

  • Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法

    本文实例讲述了Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法.分享给大家供大家参考,具体如下: 一.如图 二.代码实现 public class ColorImageActivity extends Activity { private ImageView mImageView; private SeekBar mSBRed,mSBGreen,mSBBlue,mSBAlpha,mSBLight; //修改后的图片 private Bitmap mModBitmap; //画布

  • Android开发中通过手机号+短信验证码登录的实例代码

    首先,需要一个电话号码,目前很多账户都是将账户名设置成手机号,然后点击按钮获取手机验证码. 其次,你需要后台给你手机短信的验证接口,各个公司用的不一样,这个身为前端,不需要你来考虑,你只要让你后台给你写好接口,你直接调用就好了. activity_login.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andr

  • Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题

    前言 之前在做一个Viewpager上面加载多个Fragment时总会实例化已经创建好的Fragmnet对象类似 viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { switch(position){ case 0: fragments=new Fragmnet01(); break; case

  • 详解Kotlin Android开发中的环境配置

    详解Kotlin Android开发中的环境配置 在Android Studio上面进行安装插件 在Settings ->Plugins ->Browse repositores.. ->kotlin 安装完成后重启Android Studio就生效了 如图所示: 在Android Studio中做Kotlin相关配置 (1)在根目录 的build.gradle中进行配置使用,代码如下: buildscript { ext.kotlin_version = '1.1.2-4' repos

  • 深入解读Android开发中Activity的生命周期

    什么是Activity        首先,Activity是Android系统中的四大组件之一,可以用于显示View.Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的,但是如果这样就能说Activity主要是用来显示View就不太正确了. 在深入了解Activity之前,我们先要知道一下MVC设计模式,在JAVAEE 中MVC设计模式已经很经典了,而且分的也比较清晰了,但是在Android中,好多人对MVC在Android开发中的应用不是很清楚,下面我

随机推荐