1. 程式人生 > >C#中將double變數格式化為字串,且保留小數點後面的全部位數

C#中將double變數格式化為字串,且保留小數點後面的全部位數

原文:

【問題】

C#中已經獲得一個double變數值,比如1343392590725.6758,然後想要將其轉換為字串,且保留全部的小數點後的4位,但是結果卻是:

?
1 2 3 4 5 6 7 8 9 10 11 private void doubleToStringTest() { double curMilliSecDouble = 1343392590725.6758; //double curMilliSecDouble = crl.getCurTimeInMillisec();        //1343392590725.6758 string curMilliSecStrF = curMilliSecDouble.ToString(
"%.4f");    //%1343404742649074f string curMilliSecStrG = curMilliSecDouble.ToString("G");       //1343404742649.07 string curMilliSecStrG4 = curMilliSecDouble.ToString("G4");     //1.343E+12 string curMilliSecStr00 = curMilliSecDouble.ToString("0.0000"); //1343404742649.0700 string curMilliSecStrF6 = curMilliSecDouble.ToString(
"f6");     //1343392590725.680000 string curMilliSecStr = curMilliSecDouble.ToString();           //1343404742649.07 }

始終都不能顯示出4位的小數。

【解決過程】

2.後來好不容易找到了微軟官方教程:標準數值格式字串,並寫出了上述測試程式碼,但是始終還是隻是輸出小數點後2位。

3.網上這人也遇到了類似問題:

但是沒人解釋的清楚.

5.參考這裡去用Math.Round:

?
1 string roundedDoubleStr = Math.Round(curMilliSecDouble, 4).ToString();

結果輸出還是1343392590725.68,而不是所希望的1343392590725.6758

6.參考這裡去試了是#:

?
1 string curMilliSecStrXing = curMilliSecDouble.ToString("#.####"); //1343392590725.68

結果問題依舊。

然後可以看出,對於:1343392590725.6758

其共17位數字,整數部分13位,小數部分4位

然後就去故意測試少一位的情況,比如:

343392590725.6758

此double值,其共16位數字,整數部分12位,小數部分4位

然後測試結果就是可以再多輸出一位小數的:

?
1 2 3 4 double less1BitDouble = 343392590725.6758; string less1BitDoubleStrG = less1BitDouble.ToString("G");   //"343392590725.676" string less1BitDoubleStrF = less1BitDouble.ToString("F");   //"343392590725.68" string less1BitDoubleStrF6 = less1BitDouble.ToString("F6"); //"343392590725.676000"

後來又去試了試用更小一點的double值去測試:

?
1 2 3 4 double smallValDouble = 1234.567890; string smallValDoubleStrG = smallValDouble.ToString("G");   //1234.56789 string smallValDoubleStrF = smallValDouble.ToString("F");   //1234.57 string smallValDoubleStrF6 = smallValDouble.ToString("F6"); //1234.567890

結果很明顯,是可以安裝所期望的正常輸出的:

F:預設是2位小數點

F6:輸出小數點後6位,不夠的話用0補齊

G:預設輸出原先的,保留小數點後面的位數(對於double預設是最多15個,詳見:標準數值格式字串)。

【總結】

此處像1343392590725.6758一樣的double值,不論去用ToString格式化輸出,不論引數是F還是G,還是FN或GN,結果都還是2位的小數點,其原因在此double值太大了,總的位數,正好是13+4=17,而實際上內部最多隻能存15位,所以實際上小數點後面只有2位,所以輸出的時候,始終只能輸出2位,正巧和F引數預設輸出2位所吻合,所以以為F和G等引數沒有實際生效呢。



相關推薦

C#中將double變數格式化為字串保留小數點後面全部位數

原文: 【問題】 C#中已經獲得一個double變數值,比如1343392590725.6758,然後想要將其轉換為字串,且保留全部的小數點後的4位,但是結果卻是: ? 1 2 3 4 5 6 7 8 9 10 11 private void doubleTo

C語言從控制檯輸入一個字串然後賦值給變數

一、常規程式碼: char name[5]; printf("Name: "); scanf("%s", name); printf("Name = %s\n", name); 測試: 1、輸入“abc”, 輸出“abc”,正確 2、輸入“ab c”, 輸出“ab”, 出

SimpleDateFormat得到年月日格式字串再轉為int型別

1.年月日 public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); int nowDay = Integer.parse

c語言判斷是否是utf8字串計算字元個數

#include <stdio.h> #include <string.h> #include <stdlib.h> /******************************************************************

ACMNO.40 C語言-子串 有一字串包含n個字元。寫一函式將此字串中從第m個字元開始的全部字元複製成為另一個字串

題目描述 有一字串,包含n個字元。 寫一函式,將此字串中從第m個字元開始的全部字元複製成為另一個字串。 輸入 數字n 一行字串 數字m 輸出 從m開始的子串 樣例輸入 6 abcdef 3 樣例輸出 cdef 來源/分類 C語言

C語言】輸入三個字串由小到大排序輸出。

仔細觀察下面程式: #include <stdio.h> #include <string.h> void swap(char *p1,char *p2) { char *ret = p1; p1 = p2;

C#中將string型別的json字串轉化成陣列

新增引用  using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Collections.Generic; string jsonText = {"Total":"0", "Rows": [ { "

C實現】給出一個字串要求將其按照單詞順序進行反轉

題目:給出一個字串,要求將其按照單詞順序進行反轉,比如如果是”the sky is blue”,那麼反轉之後的結果就是”blue is sky the”。 問題分析: 每個單詞長度不一致 空格需要

C++將整形變數轉換為字串

#include <iostream> #include <string> #include <sstream> using namespace std; strin

用字元指標變數指向一個字串然後輸出字元及其長度

#include<stdio.h> #include<string.h>                                         // 要使用strlen函式 int main() {     char *p;     p =

將UIBezierPath存為自定義格式字串再將字串轉為UIBezierPath

<pre name="code" class="objc">自定義字串格式為:@"123.02,234.23|321.23,432.0002|543.0003,432.0045|654.0034,567.0034|23.3443,56.0034|77.3440,

python中大於0的元素全部化為1小於0的元素全部化為0的代碼

pre post class body col 元素 span print color 【code】 """ 大於0的元素全部轉化為1 """ np_arr = np.array([[1 ,2, 3, 4]]) print("轉化前:") print(np_arr) pr

C++:從鍵盤輸入一個整數判斷該數是幾位數並且逆向輸出該數字

#include using namespace std; int change(int n) //逆向輸出該數 {int rn; for(int i=0;i<10;i++) { if(n>0) { rn=rn*10+n%10; n=n/10;

jsjs字串每三位加逗號保留小數點部分

/** * Created by dcp on 2018/9/28. */ // 寫程式碼實現一個 cut 函式cut(3123123123.123); //3,123,123,123.123

Java指定長度隨機生成的字串這個字串必須包含大小寫字母和數字

public static String gen(int length) {  char[] ss = new char[length];  int i=0; while(i<length) {     int f = (int) (Math.random()*3);

批處理替換文字檔案中的字串保留換行

@echo on REM --- File Name:ReplaceString.bat----- REM ---Call Method---- REM ---ReplaceString "SrcFileName" "TargetFileName" "SrcStr" "TargetStr" ---- s

JS匯出Excel相容IE保留樣式

var tableHtml='<html><head><meta charset="UTF-8"></head><body>'; tableHtml += lHtml; tableHtml += '

double和BigDecimal互相轉換及保留小數點後的位數

1,保留6位小數點NumberFormat format = NumberFormat.getInstance(); format.setMinimumFractionDigits(6); String s= format.format(double/BigDecimal);

如果整數A 的全部因子(包括1不包括A本身)之和等於B整數B的全部 因子包括1不包括B 本身)之和等於A則稱整數A\B是一對親密數。 求3000 以內的全部親密數。

public class Text親密數 {//主函式public static void main(String[] args) {for(int a=2;a<3000;a++) {int b=sum(a);//將sum(a)的值賦值給b               

JS控制文本框只能輸入數字並且保留小數點後兩位

文本 只能輸入數字 rep max light 清除 style input paste <input type="text" placeholder="保留到小數點後兩位" maxlength="200" onkeyup="num(this)" onpaste