在银行之类的企业里面,会遇到很多数字,特别是小数,对于小数精度的保留是许多程序员要注意的事情。
常见的c# 处理小数位数如下:Math.Round(0.333333,2);//按照四舍五入的国际标准
double dbdata=0.335333;
string str1=String.Format("{0:F}",dbdata);//默认为保留两位decimal.Round(decimal.Parse("0.3333333"),2)private System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo(); float test=0.333333f;
nfi.NumberDecimalDigits=2;
string result=test.ToString("N", nfi); string result= String.Format("{0:N2}",Convert.ToDecimal("0.333333").ToString());// 这是个保留两位小数并加千分位符号的方法Convert.ToDouble(DataBinder.Eval(dbr, "入账学杂费")).ToString("n");现有要求如下,确定了精度(如 0.001),对数字做不同的处理1.正数,如12.1111,则需转换为12.112,而12.11则仍为12.11,即按精度截取,但不是四舍五入,而是如果是正数则进12.附属,如-12.1111,则需转换为-12.111,即如果为负数,则去掉我的想法:1.将数字转换为字符串类型,获取小数的位数,如0.01则小数位数为22.根据位数判断,如果要转换的数的小数位数小于等于精度的小数位数,则无需转换(也无需判断正负)3.如果 要转换的数的小数位数大于精度的小数位数,则需转换并需判断正负4. 如果为正数,将要转换的数与精度(必须为0.01类似的形式)相加并截取精度的小数位数的字符串5.如果为负数,直接截取下面是我的代码:
http://files.cnblogs.com/alexis/AccuracyConvert.rar 我知道这样做肯定会存在很多问题,例如在数字转换字符串时候精度丢失之类的问题,但只是目前我的想法,希望大虾们教我下,什么方法更好,更方便(我已经在博客园发表了,现在抄过来,嘿嘿)
常见的c# 处理小数位数如下:Math.Round(0.333333,2);//按照四舍五入的国际标准
double dbdata=0.335333;
string str1=String.Format("{0:F}",dbdata);//默认为保留两位decimal.Round(decimal.Parse("0.3333333"),2)private System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo(); float test=0.333333f;
nfi.NumberDecimalDigits=2;
string result=test.ToString("N", nfi); string result= String.Format("{0:N2}",Convert.ToDecimal("0.333333").ToString());// 这是个保留两位小数并加千分位符号的方法Convert.ToDouble(DataBinder.Eval(dbr, "入账学杂费")).ToString("n");现有要求如下,确定了精度(如 0.001),对数字做不同的处理1.正数,如12.1111,则需转换为12.112,而12.11则仍为12.11,即按精度截取,但不是四舍五入,而是如果是正数则进12.附属,如-12.1111,则需转换为-12.111,即如果为负数,则去掉我的想法:1.将数字转换为字符串类型,获取小数的位数,如0.01则小数位数为22.根据位数判断,如果要转换的数的小数位数小于等于精度的小数位数,则无需转换(也无需判断正负)3.如果 要转换的数的小数位数大于精度的小数位数,则需转换并需判断正负4. 如果为正数,将要转换的数与精度(必须为0.01类似的形式)相加并截取精度的小数位数的字符串5.如果为负数,直接截取下面是我的代码:
http://files.cnblogs.com/alexis/AccuracyConvert.rar 我知道这样做肯定会存在很多问题,例如在数字转换字符串时候精度丢失之类的问题,但只是目前我的想法,希望大虾们教我下,什么方法更好,更方便(我已经在博客园发表了,现在抄过来,嘿嘿)
解决方案 »
- 无法打开登录所请求的数据库 "db_VOD"。sa登录失败
- 怎样终止运行的线程
- log4net无法写log的问题
- C# 修改文件夹名?
- 帮忙看看哪错了,
- MdiList
- vs2005编译的release版本 为何在没有开发环境的机器上 有的功能无法弹出窗口呢? 无法弹出的都是引用的一个dll组件中的。在有开发环境的机器上什么都可以呢?该怎么解决呢
- 在C#中如何得到 axMSComm1.Input 属性的内容?如何赋到一个变量中?
- 请教各位:如何用c#生成以下的XML文档?
- 在c#中如何读取Oracle数据库中的blob类型数据,类似邮件中的附件形式显示
- 求一SQL语句
- windowForm中,怎么做个年月控件(只有年月),本人菜鸟给个例子
利用 substring+indexof 来实现
{
double temp1 = Math.Pow(10, digit);
double temp2 = value * temp1;
temp2 +=0.5;
return (Math.Floor(temp2) / temp1);
}
Financial calculation using .NET Part 1
http://www.codeproject.com/KB/aspnet/FinanceCalculation/3.jpgFinancial Calculation using .NET:- Depreciation Part-2
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace AccuracyConvert
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} /// <summary>
/// 精度兑换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnConvert_Click(object sender, EventArgs e)
{
//validate ,省略
//精度
double accuracy = double.Parse(txtAccuracy.Text.ToString());
//收支类型
double money = double.Parse(txtMoney.Text.ToString()); //MessageBox.Show(GetLength(money).ToString());
txtConvertedMoney.Text = Convert(accuracy, money) ;
} /// <summary>
/// 精度转换
/// </summary>
/// <param name="accuracy"></param>
/// <param name="money"></param>
/// <returns></returns>
private string Convert(double accuracy,double money )
{
string result="";
//精度小,如accuracy:0.1而money为12,此时不需转换
if (GetLength(money) < GetLength(accuracy))
{
result = money.ToString();
}
else
{
int length = GetLength(accuracy);//精度长度 System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
provider.NumberDecimalDigits = length; //要设定的小数位数 if (money > 0)//收入,if 0.01, 12.321==>12.33
{
result = (money+accuracy).ToString("N", provider); //再利用ToString函数格式化小数位数
}
else//支出, if 0.01, -12.321==>12.32
{
result = money.ToString("N", provider); //再利用ToString函数格式化小数位数
}
}
return result;
} /// <summary>
/// 获取小数的长度
/// </summary>
/// <param name="number"></param>
/// <returns></returns>
private int GetLength(double number)
{
string tempString = number.ToString();
if (tempString.LastIndexOf('.') > 0)
{
return tempString.Substring(tempString.LastIndexOf('.') + 1).Length;
}
else
{
return 0;
}
}
}
}
要求如下,确定了精度(如 0.001),对数字做不同的处理
1.正数,如12.1111,则需转换为12.112,而12.11则仍为12.11,即按精度截取,但不是四舍五入,而是如果是正数则进12.负数,如-12.1111,则需转换为-12.111,即如果为负数,则去掉我的想法:
1.将数字转换为字符串类型,获取小数的位数,如0.01则小数位数为2
2. 根据位数判断,如果要转换的数的小数位数小于等于精度的小数位数,则无需转换(也无需判断正负)
3.如果 要转换的数的小数位数大于精度的小数位数,则需转换并需判断正负
4. 如果为正数,将要转换的数与精度(必须为0.01类似的形式)相加并截取精度的小数位数的字符串
5.如果为负数,直接截取下面是我的代码:
http://files.cnblogs.com/alexis/AccuracyConvert.rar
int precision = 3;
double value = -12.1111;
value = Math.Ceiling(value * Math.Pow(10, precision)) / Math.Pow(10, precision);