导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

关于 double 转 string 的问题

wg5945 2014-11-10 10:15:09
由于要将前方传来的double类型参数进行加密,需要完全保留double的样式

现在有个问题

如果前方传过来的是100.0,直接toString的话会是100,

如果限制小数位数的话,万一前方传过来个100.123这种样子的,就不好办了

有没有什么解决方法呢?

double a=100.0; => "100.0"
double b=100.123; => "100.123"
...全文
245 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxldfang 2014-11-10
下面只是说a是double类型的数据: double a=10; 而你说的“10”,或者“10.000”只是一种显示的格式。 想怎么显示出来,你是可以控制的,比如楼上出现的如: double.ToString("0.000") string.Format("{0:G}", a) 等
回复
wg5945 2014-11-10
引用 13 楼 Z65443344 的回复:
java没玩过 话说,java里100.00000转string后还是100.00000? 不对吧,java编译器不应该这么扯淡吧 对于double型来说,难道100.0和100是不相等的,否则转string后就应该一样才对
100.00000转string后是100.0 然后我会拼成a=100.0&b=... 这种类型的字符串后在加密, 前台传过来的是a=100.0&b=...,我这边是a=100&b=...,加密的结果当然会不一样~~
回复
wg5945 2014-11-10
引用 10 楼 rtdb 的回复:
[quote=引用 8 楼 Z65443344 的回复:] 难道你不是把double转byte数组然后加密,而是先转字符串,再加密??
+1 要无损加密的话,转byte数组后加密byte数组。 转字符串是一定会损失精度的 [/quote] 这个倒没必要考虑,就是一个价格而已,不会有多少位的~~
回复
於黾 2014-11-10
java没玩过 话说,java里100.00000转string后还是100.00000? 不对吧,java编译器不应该这么扯淡吧 对于double型来说,难道100.0和100是不相等的,否则转string后就应该一样才对
回复
wg5945 2014-11-10
引用 7 楼 Z65443344 的回复:
另,完全没看出这跟加密到底有什么关系 只不过显示的时候处理一下而已,跟原始数据完全无关啊
想将前台将全部参数加密后和后台的加密结果做个对比,前台是安卓端的, java里面100.0 转 string后就是100.0 c#里面会变成100 然后加密的结果就不一样了~~ 其实2楼的方法简单处理下就可以了, 1楼的方法也不错,不过牵扯到安卓端的加密方法也要做修改,有点麻烦~~
回复
sunny906 2014-11-10

            //double a = 100.0;
            double a = 100.123;
            string temp = a.ToString("F");
            string result = "";
            if (temp.Contains(".") && temp.Substring(temp.Length - 1) == "0")
            {
                result = temp;
            }
            else
            {
                result = string.Format("{0:G}", a);
            }
            Console.WriteLine(result);
回复
rtdb 2014-11-10
引用 8 楼 Z65443344 的回复:
难道你不是把double转byte数组然后加密,而是先转字符串,再加密??
+1 要无损加密的话,转byte数组后加密byte数组。 转字符串是一定会损失精度的
回复
gzdiablo 2014-11-10
string.ToString("0.###########")
回复
於黾 2014-11-10
难道你不是把double转byte数组然后加密,而是先转字符串,再加密??
回复
於黾 2014-11-10
另,完全没看出这跟加密到底有什么关系 只不过显示的时候处理一下而已,跟原始数据完全无关啊
回复
於黾 2014-11-10
没看出你到底想按什么规律显示 你可以double.ToString("0.000"); 让它固定显示3位小数,或者double.ToString("F3");都行 而如果是整数要保留一个.0,小数有多少位显示多少位 double.ToString("0.0####");这样就可以了
回复

            var val = 123.4568901234567d;
            const byte ARGS = 0xF5; //随意的0~255之间的数字
            Func<double, double> encryptProc = raw => BitConverter.ToDouble(
                (from b in BitConverter.GetBytes(raw)select Convert.ToByte(b ^ ARGS)).ToArray(), 
                0);
            var encryption = encryptProc(val);
            Console.WriteLine("原文:{0}\t密文:{1}", val, encryption);
            var decryption = encryptProc(encryption);
            Console.WriteLine(decryption);            
            Console.Read();
与同一个数两次异或等于原数
回复
phommy 2014-11-10
double不保存无效数字,或者用你的说法,原“样式”。如果需要,你可以用decimal类型,那个是牺牲效率保留样式的 10.000.ToString() // "10" 10.000m.ToString() //"10.000"
回复
trentliu 2014-11-10
double temp = 3.0; byte[] bytes = BitConverter.GetBytes(temp); double temp1 = BitConverter.ToDouble(bytes, 0); 帮楼上做了下验证, temp1 是 3.0
回复
兔子党-督察 2014-11-10
string DoubleToString(double d)
{
   string s=d.ToString("R");
   return s.Contains(".")?s:s+".0";
}
回复
bdmh 2014-11-10
不要直接用数值转字符串后加密,把原始的double写入byte数组,你对数组加密
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.