四舍五入小算法 (以前写的,采用拆分)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 四舍五入小算法
{
public class MathForRoundToFourhomesfive
{
// Math.Round((decimal)526.925, 2,MidpointRounding.AwayFromZero); 原始的自带写法

/// <summary>
/// 四舍五入方法
/// </summary>
/// <auther>
/// by
/// </auther>
/// <param name="valuedata">四舍五入的原始值</param>
/// <param name="savelength">保留位数</param>
/// <returns>处理四舍五入得到的结果值</returns>
public double GetMathRoundData(double valuedata,int savelength){

bool isPoint=false;//初始化是否是小数

isPoint=valuedata.ToString().Contains(".");

bool isNegative=valuedata.ToString().Contains("-");//是否是负数
if(isNegative){

valuedata = Convert.ToDouble(valuedata.ToString().Substring(1, valuedata.ToString().Length-1));//如果是负数,则先去除“-”,之后补全
}

///1、小数

double result = GetdoubleData(valuedata, savelength,isPoint,isNegative);

///2、整数

return result;
}

/// <summary>
/// 小数类型的数据的四舍五入
/// </summary>
/// <auther>
/// by
/// </auther>
/// <param name="valuedata">四舍五入原始值</param>
/// <param name="savelength">保留位数</param>
/// <param name="isPoint">是否是小数的标识</param>
/// <param name="isNegative">是否是负数</param>
/// <returns>返回最后的结果值</returns>
public double GetdoubleData(double valuedata,int savelength,bool isPoint, bool isNegative)
{
#region 小数
if (isPoint)
{

isPoint = true;

int tempPointIndex = valuedata.ToString().IndexOf(".");//小数点的索引位
int pointLastLength = valuedata.ToString().Length - tempPointIndex - 1;//小数点之后的位数

#region 保留位为0,与非0
if (savelength == 0)
{

double tempResult = Convert.ToDouble(valuedata.ToString().Substring(0, tempPointIndex));
double tempLastValue = Convert.ToDouble(valuedata.ToString().Substring(tempPointIndex + 1, 1));

//保留位是否四舍五入
if (tempLastValue < 5)
{
tempLastValue = 0;
}
else
{

tempLastValue = 1;
}

tempResult = tempResult + tempLastValue;

if (isNegative)//是否为负数
{

return Convert.ToDouble("-" + tempResult.ToString());
}
else
{

return tempResult;
}

}
else
{

if (pointLastLength > savelength)
{

int tempsavePointIndex = tempPointIndex + savelength + 1;//保留位数后一位的值
int tempLastData = Convert.ToInt32(valuedata.ToString().Substring(tempsavePointIndex, 1));//截取保留位那位数字

if (tempLastData >= 5)
{
//保留位那位数字加1
int tempChangeData = Convert.ToInt32(valuedata.ToString().Substring(tempPointIndex + savelength, 1)) + 1;
//截取保留位在内的总长度-1
string tempValuedata = valuedata.ToString().Substring(0, tempPointIndex + savelength);
string resultdata = tempValuedata + tempChangeData.ToString();
valuedata = Convert.ToDouble(resultdata);//现将他们用字符串拼接,再次组合成double类型的数据

if (isNegative)
{
return Convert.ToDouble("-" + valuedata.ToString());
}
else
{
return valuedata;
}

}
else
{
//保留位那位数字加1
int tempChangeData = Convert.ToInt32(valuedata.ToString().Substring(tempPointIndex + savelength, 1));
//截取保留位在内的总长度-1
string tempValuedata = valuedata.ToString().Substring(0, tempPointIndex + savelength);
string resultdata = tempValuedata + tempChangeData.ToString();
valuedata = Convert.ToDouble(resultdata);//现将他们用字符串拼接,再次组合成int类型的数据
if (isNegative)
{
return Convert.ToDouble("-" + valuedata.ToString());
}
else
{
return valuedata;
}
}

}
else
{

return valuedata;
}
}
#endregion
}
else
{
if (isNegative)
{
return Convert.ToDouble("-" + valuedata.ToString());
}
else
{
return valuedata;
}

}
#endregion

}

}
}

时间: 2024-10-12 23:02:46

四舍五入小算法 (以前写的,采用拆分)的相关文章

特殊的日子(2015年5月1日劳动节)纪念回归和新的征程,用LRU和LFU两个小算法原理和区别来抛砖引玉

很久没有写过新的博客了,原因有很多,冠冕堂皇的理由就是工作忙,生活忙,各种累,直白一点其实就是变懒了,所以没有写. 在沉寂了这么长一段时间过后,终于又要重新出发了,对于自己当前的状态,觉得首先要有所沉淀,然后就是要放空自己,唯有放空自己方能继续进步. 以后一段时间更新的博客内容主体是与Android Framework相关的疑难问题分析.机制实现的原理.源代码调用分析,然后伴有一些常用的小算法,语言特性,程序原理等. 今天就先介绍LRU和LFU这两个在Android的Framework以及App

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

应用小算法

最近在做一个WPF小项目,因为需要处理一些数据,迫不得已写了一个函数,算是一个小算法吧,在此写出以便温故知新,同时希望牛人不吝赐教,点出其中不足之处. 简化需求: 创建一个datatable表dt,dt表中的记录行数是变量m.创建datatable表dt1.dt2,dt1和dt2循环显示dt中的数据,添加一个计时器定时刷新dt1.dt2中的数据,且dt1和dt2每次只能显示n行. 1.声明变量 private DispatcherTimer timer; DataTable dt = new D

java每日小算法(27)

/* [程序27]  题目:求100之内的素数    */ package test; import java.util.Scanner; public class test { public static boolean prime(int number) { boolean flag = true; int mid = (int)Math.sqrt(number); for(int i = 2; i< mid+1; i++) { if(number % i == 0) { flag = fa

java每日小算法(4)

[程序4] 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. package test; import java.util.ArrayList;

循环圈小算法

小算法循环圈的公式:(n+1) % (maxN+1) 比如实现0到3的循环 0+1 %4 = 1 1+1 %4 = 2 2+1 %4 = 3 3+1 %4 = 0 比如实现1到3的循环 1+1 %4 = 2 2+1 %4 = 3 3+1 %4 = 1

大数据处理时的一种BitMap小算法

一种大数据外部排序(内存无法加载所有排序元素).去除重复元素.快速找到随机被删除元素的BitMap小算法,核心思想即通过将一个数作为下标(index)来索引一个bit表示一个数是否存在,排序时的时间复杂度为O(N),需要的额外空间的复杂度O(N/8),支持整个int范围(正负数都支持)的算法示例如下: char BitMask[] = {0x80 , 0x40 , 0x20 , 0x10 , 0x8 , 0x4 , 0x2 , 0x1}; int WriteNumberBitToByte(cha

小算法笔记

素数: 除 1 外只能被 1 和自身整除的数. 方法一: #include <stdio.h> #define N 1000 int num = 0; int prime(int n) { int i; if(n % 2 == 0) return (n == 2); if(n % 3 == 0) return (n == 3); if(n % 5 == 0) return (n == 5); for(i = 7; i*i <= n; ++i) if(n % i == 0) return

一个很小的C++写的MVC的例子

#include<iostream> #include<vector> //get namespace related stuff using std::cin; using std::cout; using std::endl; using std::flush; using std::string; using std::vector; //struct Observer, modeled after java.utils.Observer struct Observer /*