精华内容
下载资源
问答
  • 自定义Numberpicker

    热门讨论 2015-04-24 13:10:04
    自定义的Numberpicker,更改了字体颜色、大小、显示的个数、线条颜色,具体讲解:http://blog.csdn.net/a296777513/article/details/45242601
  • Rope Sequence Number ST和Rope Sequence Number HT字体 需要用的自然知道这是干啥的。
  • android NumberPicker修改选中内容的颜色等

    千次下载 热门讨论 2014-08-04 19:27:46
    可以修改选中的字体的颜色、内容等,也可以修改选中的两条线的颜色,具体样式可以看这里:http://blog.csdn.net/the_path/article/details/38334899
  • BigNumber.js 讲解

    千次阅读 2020-12-04 15:54:16
    JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。 至于为什么JavaScript会有精度问题呢,可以看...

    在这里插入图片描述
    JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。

    至于为什么JavaScript会有精度问题呢,可以看https://github.com/camsong/blog/issues/9。简单来说就是因为:JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。

    BigNumber.js是一个用于任意精度计算的js库。可以在 官方文档 的console中测试使用。也可以通过 npm install bignumber.js --save 来安装。然后 import BigNumber from ‘bignumber.js’ 来引入使用。他的大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。

    具体用法可以参考以下资料:

    • https://mikemcl.github.io/bignumber.js/

    constructor

    /*
    *    n {number|string|BigNumber} A numeric value.
    *   [b] {number} The base of n. Integer, 2 to ALPHABET.length inclusive.
    */
    function BigNumber(n, b) {
       
    }
    

    静态方法

    clone()

    生成一个独立的BigNumber构造函数

    var BN = BigNumber.clone()
    BN(1).div(3).toNumber() //0.3333333333333333
    

    config()

    为这个独立的BigNumber构造函数设置参数
    主要包括以下几个参数:

    1. DECIMAL_PLACES(默认值:20) 用于设置小数位数。在除法、开方、指数计算时会用到。
    var BN = BigNumber.clone()
    BN.config({DECIMAL_PLACES:4})
    BN(1).div(3).toNumber() //0.3333,注意跟上面计算结果的区别
    
    1. ROUNDING_MODE(默认值4) 舍入模式,取值的意义可参照 文档
    //取值范围:
    BigNumber.ROUND_UP = 0;         //远离0方向舍入
    BigNumber.ROUND_DOWN = 1;       //向0方向舍入
    BigNumber.ROUND_CEIL = 2;       //向正无限大舍入
    BigNumber.ROUND_FLOOR = 3;      //向负无限大舍入
    BigNumber.ROUND_HALF_UP = 4;    //四舍五入:向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向上舍入。
    BigNumber.ROUND_HALF_DOWN = 5;  //向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向下舍入。
    BigNumber.ROUND_HALF_EVEN = 6;  //向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
    BigNumber.ROUND_HALF_CEIL = 7;
    BigNumber.ROUND_HALF_FLOOR = 8;
    
    1. EXPONENTIAL_AT(默认值[-7,20]) 指数计数法
    2. RANGE(默认值[-1e+9,1e+9])
    3. CRYPTO(默认值 false) 用于设置BigNumber.random()的随机生成算法。如果无法设置为true,则使用Math.random()生成随机值。
    4. MODULO_MODE(默认值:ROUND_DOWN) 取模运算的模式
    5. POW_PRECISION(默认值:0) pow运算结果的精度
    6. FORMATE(格式化对应的设置)
    默认值:
    BigNumber.config().FORMAT
    ==============================
    {
    decimalSeparator: "."
    fractionGroupSeparator: " "
    fractionGroupSize: 0
    groupSeparator: ","
    groupSize: 3
    secondaryGroupSize: 0
    }
    

    获取数组中的最大值/最小值

    maximum([]),minimum([])

    返回一个伪随机值,参数可以指定小数点位数

    random([precision])

    实例方法

    加法:.plus(n [, base]) ⇒ BigNumber

    0.1 + 0.2                       // 0.30000000000000004
    x = new BigNumber(0.1)
    y = x.plus(0.2)                 // '0.3'
    BigNumber(0.7).plus(x).plus(y)  // '1'
    x.plus('0.1', 8)                // '0.225'
    

    减法:.minus(n [, base]) ⇒ BigNumber

    0.3 - 0.1                       // 0.19999999999999998
    x = new BigNumber(0.3)
    x.minus(0.1)                    // '0.2'
    x.minus(0.6, 20)                // '0'
    

    乘法:.times(n [, base]) ⇒ BigNumber; m.ultipliedBy(n [, base]) ⇒ BigNumber;

    0.6 * 3                         // 1.7999999999999998
    x = new BigNumber(0.6)
    y = x.multipliedBy(3)           // '1.8'
    BigNumber('7e+500').times(y)    // '1.26e+501'
    x.multipliedBy('-a', 16)        // '-6
    

    普通除法运算: .div(n [, base]) ⇒ BigNumber; .dividedBy(n [, base]) ⇒ BigNumber

    x = new BigNumber(355)
    y = new BigNumber(113)
    x.dividedBy(y)                  // '3.14159292035398230088'
    x.div(5)                        // '71'
    x.div(47, 16)                   // '5'
    

    注意: 除法计算结果会根据DECIMAL_PLACES和ROUNDING_MODE两个属性设置进行舍入。

    除法,返回整数: .idiv(n [, base]) ⇒ BigNumber;.dividedToIntegerByv(n [, base]) ⇒ BigNumber

    x = new BigNumber(355)
    y = new BigNumber(113)
    x.dividedBy(y)                  // '3.14159292035398230088'
    x.div(5)                        // '71'
    x.div(47, 16)                   // '5'
    

    取模/取余: .mod(n [, base]) ⇒ BigNumber;modulo.(n [, base]) ⇒ BigNumber

    1 % 0.9                         // 0.09999999999999998
    x = new BigNumber(1)
    x.modulo(0.9)                   // '0.1'
    y = new BigNumber(33)
    y.mod('a', 33)                  // '3'
    

    注意: 取模/取余运算受MODULO_MODE设置影响
    指数运算: .pow(n [, m]) ⇒ BigNumber;.exponentiatedBy(n [, m]) ⇒ BigNumber

    Math.pow(0.7, 2)                // 0.48999999999999994
    x = new BigNumber(0.7)
    x.exponentiatedBy(2)            // '0.49'
    BigNumber(3).pow(-2)            // '0.11111111111111111111'
    

    比较大小: .comparedTo(n [, base]) ⇒ number
    比较结果,参考如下表:

    1	操作数>n
    -1	操作数<n
    0	操作数==n
    null	操作数或者n不是数字
    

    举例:

    x = new BigNumber(Infinity)
    y = new BigNumber(5)
    x.comparedTo(y)                 // 1
    x.comparedTo(x.minus(1))        // 0
    y.comparedTo(NaN)               // null
    y.comparedTo('110', 2)          // -1
    
    展开全文
  • 自定义numberpicker

    千次下载 热门讨论 2014-10-07 22:50:48
    整理了下github numberpicker 的 demo 方便学习和引用
  • 数字选择器NumberPicker使用教程

    万次阅读 2018-09-10 00:51:01
    &amp;...数字选择器NumberPicker是Android3.0之后引入的一个控件,比较常用,比如说手机常用的闹钟,可以选择小时和分钟,如果你需要兼容3.0之前版本,GitHub上有开源的项目,具体的下载地址ht

           数字选择器NumberPicker是Android3.0之后引入的一个控件,比较常用,比如说手机常用的闹钟,可以选择小时和分钟,如果你需要兼容3.0之前版本,GitHub上有开源的项目,具体的下载地址https://github.com/SimonVT/android-numberpicker。
     

    基本用法

    先上布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:context="com.avatarmind.numberpickerdemo.MainActivity">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="30dp">
    
            <NumberPicker
                android:id="@+id/hourpicker"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="" />
    
            <NumberPicker
                android:id="@+id/minuteicker"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:text="" />
    
        </LinearLayout>
    
    
    </LinearLayout>

     
    贴出完整的主程序代码:

    
    public class MainActivity extends AppCompatActivity implements NumberPicker.OnValueChangeListener, NumberPicker.OnScrollListener, NumberPicker.Formatter {
    
        private static final String TAG = "MainActivity";
    
        @BindView(R.id.hourpicker)
        NumberPicker hourPicker;
    
        @BindView(R.id.minuteicker)
        NumberPicker minutePicker;
    
        @BindView(R.id.valuepicker)
        NumberPicker valuePicker;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.bind(this);
            init();
        }
    
        private void init() {
            hourPicker.setFormatter(this);
            hourPicker.setOnValueChangedListener(this);
            hourPicker.setOnScrollListener(this);
            hourPicker.setMaxValue(24);
            hourPicker.setMinValue(0);
            hourPicker.setValue(9);
    
            minutePicker.setFormatter(this);
            minutePicker.setOnValueChangedListener(this);
            minutePicker.setOnScrollListener(this);
            minutePicker.setMaxValue(60);
            minutePicker.setMinValue(1);
            minutePicker.setValue(49);
    
            //设置为对当前值不可编辑
            hourPicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);
            minutePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
    
            //这里设置为不循环显示,默认值为true
            hourPicker.setWrapSelectorWheel(false);
            minutePicker.setWrapSelectorWheel(false);
        }
    
        @Override
        public String format(int value) {
            Log.i(TAG, "format: value");
            String tmpStr = String.valueOf(value);
            if (value < 10) {
                tmpStr = "0" + tmpStr;
            }
            return tmpStr;
        }
    
        @Override
        public void onScrollStateChange(NumberPicker view, int scrollState) {
            switch (scrollState) {
                case NumberPicker.OnScrollListener.SCROLL_STATE_FLING:
                    Log.i(TAG, "onScrollStateChange: 后续滑动(飞呀飞,根本停下来)");
                    break;
                case NumberPicker.OnScrollListener.SCROLL_STATE_IDLE:
                    Log.i(TAG, "onScrollStateChange: 不滑动");
                    break;
                case NumberPicker.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                    Log.i(TAG, "onScrollStateChange: 滑动中");
                    break;
            }
    
        }
    
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            Log.i(TAG, "onValueChange: 原来的值 " + oldVal + "--新值: "
                    + newVal);
    
        }
    
    }
    

     
    基本效果如下:
    这里写图片描述
     
    上述代码中,大家重点关注MainActivity实现的3个接口。
    1.NumberPicker.OnValueChangeListener
    2. NumberPicker.OnScrollListener
    1. NumberPicker.Formatter

    数字选择是可以滑动,所以需要定义一个OnValueChangeListener事件,OnScrollListener滑动事件,Formatter事件:

    Formatter事件:

     @Override
        public String format(int value) {
            Log.i(TAG, "format: value");
            String tmpStr = String.valueOf(value);
            if (value < 10) {
                tmpStr = "0" + tmpStr;
            }
            return tmpStr;
        }

     
    OnValueChangeListener事件:

     @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            Log.i(TAG, "onValueChange: 原来的值 " + oldVal + "--新值: "
                    + newVal);
    
        }

     
    OnScrollListener滑动事件,滑动事件有三个状态:

    SCROLL_STATE_FLING:手离开之后还在滑动
    
    SCROLL_STATE_IDLE:不滑动
    
    SCROLL_STATE_TOUCH_SCROLL:滑动中
    
    
        @Override
        public void onScrollStateChange(NumberPicker view, int scrollState) {
            switch (scrollState) {
                case NumberPicker.OnScrollListener.SCROLL_STATE_FLING:
                    Log.i(TAG, "onScrollStateChange: 后续滑动(飞呀飞,根本停下来)");
                    break;
                case NumberPicker.OnScrollListener.SCROLL_STATE_IDLE:
                    Log.i(TAG, "onScrollStateChange: 不滑动");
                    break;
                case NumberPicker.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                    Log.i(TAG, "onScrollStateChange: 滑动中");
                    break;
            }
    
        }

     
     初始化操作:

     private void init() {
            hourPicker.setFormatter(this);
            hourPicker.setOnValueChangedListener(this);
            hourPicker.setOnScrollListener(this);
            hourPicker.setMaxValue(24);
            hourPicker.setMinValue(0);
            hourPicker.setValue(9);
    
            minutePicker.setFormatter(this);
            minutePicker.setOnValueChangedListener(this);
            minutePicker.setOnScrollListener(this);
            minutePicker.setMaxValue(60);
            minutePicker.setMinValue(1);
            minutePicker.setValue(49);
    
            //设置为对当前值不可编辑
            hourPicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);
            minutePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
    
            //这里设置为不循环显示,默认值为true
            hourPicker.setWrapSelectorWheel(false);
            minutePicker.setWrapSelectorWheel(false);
        } 

    由于NumberPicker默认是可以对当前正在显示的数值可编辑,因此可以通过

     hourPicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);

    来设置对当前数值不可编辑。

    另外,NumberPicker默认是数字是可以循环滚动的,我们可以通过

    hourPicker.setWrapSelectorWheel(false);

    来设置其不可以循环滚动。
     

    拓展

    首先,NumberPicker也是可以显示文字的,重新定义一个NumberPicker,加载一下:

      private void valueinit() {
            String[] city = {"立水桥", "霍营", "回龙观", "龙泽", "西二旗", "上地"};
            valuePicker.setDisplayedValues(city);
            valuePicker.setMinValue(0);
            valuePicker.setMaxValue(city.length - 1);
            valuePicker.setValue(4);
    
            //设置为对当前值不可编辑
            valuePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);
        }

    效果如下:
    这里写图片描述

    其次,我们可以对NumberPicker分割线的颜色,间距,以及宽度(粗细)进行调整。方法如下:

     /**
         * 设置picker之间的间距
         */
        private void setPickerMargin(NumberPicker picker) {
            LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) picker.getLayoutParams();
            p.setMargins(0, 0, 100, 0);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
                p.setMarginStart(0);
                p.setMarginEnd(100);
            }
        }
    
        /**
         * 设置picker分割线的颜色
         */
        private void setDividerColor(NumberPicker picker) {
            Field field = null;
            try {
                field = NumberPicker.class.getDeclaredField("mSelectionDivider");
                if (field != null) {
                    field.setAccessible(true);
                    field.set(picker, new ColorDrawable(Color.RED));
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 设置picker分割线的宽度(分割线的粗细)
         */
        private void setNumberPickerDivider(NumberPicker picker) {
            Field[] fields = NumberPicker.class.getDeclaredFields();
            for (Field f : fields) {
                if (f.getName().equals("mSelectionDividerHeight")) {
                    f.setAccessible(true);
                    try {
                        f.set(picker, 1);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }

    上述3种效果如下图:

    这里写图片描述

     
    最后,我们也可以通过自定义NumberPicker的方式来调整数值字体的颜色以及大小,自定义NumberPicker代码如下

    /**
     * 重写NumberPicker已达到修改显示字体颜色大小
     */
    public class TextColorNumberPicker extends NumberPicker {
    
        public TextColorNumberPicker(Context context) {
            super(context);
        }
    
        public TextColorNumberPicker(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public TextColorNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
    
        @Override
        public void addView(View child) {
            super.addView(child);
            updateView(child);
        }
    
        @Override
        public void addView(View child, int width, int height) {
            super.addView(child, width, height);
            updateView(child);
        }
    
        @Override
        public void addView(View child, int index, ViewGroup.LayoutParams params) {
            super.addView(child, index, params);
            updateView(child);
        }
    
        @Override
        public void addView(View child, ViewGroup.LayoutParams params) {
            super.addView(child, params);
            updateView(child);
        }
    
        public void updateView(View view) {
            if (view instanceof EditText) {
                //这里修改显示字体的属性,主要修改颜色和大小
                ((EditText) view).setTextColor(Color.parseColor("#FF0000"));
                ((EditText) view).setTextSize(20);
            }
        }
    }
    

     
    效果如下:
    这里写图片描述

     

          好了,上面就是数字选择器NumberPicker的基本使用方法,小伙伴们如果有问题请留言,后续我会借助NumberPicker等来编写一个比较“精致”的时间选择器,敬请关注。

    展开全文
  • bignumber.js使用记录

    千次阅读 2018-11-05 09:45:22
    本文可以看做是对bignumber.js官方文档的翻译。 bignumber.js是一个用于进行数学运算的库,支持任意精度。官网,可以在官网的console中测试它的API constructor /* * n {number|string|BigNumber} A numeric value....

    本文可以看做是对bignumber.js官方文档的翻译。

    bignumber.js是一个用于进行数学运算的库,支持任意精度。官网,可以在官网的console中测试它的API

    constructor

    /*
         * n {number|string|BigNumber} A numeric value.
         * [b] {number} The base of n. Integer, 2 to ALPHABET.length inclusive.
         */
        function BigNumber(n, b) {
            
        }
    复制代码

    静态方法

    clone()

    生成一个独立的BigNumber构造函数

    var BN = BigNumber.clone()
    BN(1).div(3).toNumber() //0.3333333333333333
    复制代码

    config()

    为这个独立的BigNumber构造函数设置参数

    主要包括以下几个参数:

    1. DECIMAL_PLACES(默认值:20) 用于设置小数位数。在除法、开方、指数计算时会用到。
    var BN = BigNumber.clone()
    BN.config({DECIMAL_PLACES:4})
    BN(1).div(3).toNumber() //0.3333,注意跟上面计算结果的区别
    复制代码
    1. ROUNDING_MODE(默认值4) 舍入模式,取值的意义可参照 文档
    //取值范围:
        BigNumber.ROUND_UP = 0;         //远离0方向舍入
        BigNumber.ROUND_DOWN = 1;       //向0方向舍入
        BigNumber.ROUND_CEIL = 2;       //向正无限大舍入
        BigNumber.ROUND_FLOOR = 3;      //向负无限大舍入
        BigNumber.ROUND_HALF_UP = 4;    //四舍五入:向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向上舍入。
        BigNumber.ROUND_HALF_DOWN = 5;  //向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向下舍入。
        BigNumber.ROUND_HALF_EVEN = 6;  //向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
        BigNumber.ROUND_HALF_CEIL = 7;
        BigNumber.ROUND_HALF_FLOOR = 8;
    复制代码
    1. EXPONENTIAL_AT(默认值[-7,20]) 指数计数法
    2. RANGE(默认值[-1e+9,1e+9])
    3. CRYPTO(默认值 false) 用于设置BigNumber.random()的随机生成算法。如果无法设置为true,则使用Math.random()生成随机值。
    4. MODULO_MODE(默认值:ROUND_DOWN) 取模运算的模式
    5. POW_PRECISION(默认值:0) pow运算结果的精度
    6. FORMATE(格式化对应的设置)
    默认值:
    BigNumber.config().FORMAT
    ==============================
    {
    decimalSeparator: "."
    fractionGroupSeparator: " "
    fractionGroupSize: 0
    groupSeparator: ","
    groupSize: 3
    secondaryGroupSize: 0
    }
    复制代码

    maximum([]),minimum([])

    获取数组中的最大值/最小值

    random([precision])

    返回一个伪随机值,参数可以指定小数点位数

    实例方法

    加法:.plus(n [, base]) ⇒ BigNumber

    0.1 + 0.2                       // 0.30000000000000004
    x = new BigNumber(0.1)
    y = x.plus(0.2)                 // '0.3'
    BigNumber(0.7).plus(x).plus(y)  // '1'
    x.plus('0.1', 8)                // '0.225'
    复制代码

    减法:.minus(n [, base]) ⇒ BigNumber

    0.3 - 0.1                       // 0.19999999999999998
    x = new BigNumber(0.3)
    x.minus(0.1)                    // '0.2'
    x.minus(0.6, 20)                // '0'
    复制代码

    乘法:.times(n [, base]) ⇒ BigNumber; m.ultipliedBy(n [, base]) ⇒ BigNumber;

    0.6 * 3                         // 1.7999999999999998
    x = new BigNumber(0.6)
    y = x.multipliedBy(3)           // '1.8'
    BigNumber('7e+500').times(y)    // '1.26e+501'
    x.multipliedBy('-a', 16)        // '-6
    复制代码

    除法

    普通除法运算: .div(n [, base]) ⇒ BigNumber; .dividedBy(n [, base]) ⇒ BigNumber

    x = new BigNumber(355)
    y = new BigNumber(113)
    x.dividedBy(y)                  // '3.14159292035398230088'
    x.div(5)                        // '71'
    x.div(47, 16)                   // '5'
    复制代码

    注意: 除法计算结果会根据DECIMAL_PLACES和ROUNDING_MODE两个属性设置进行舍入。

    除法,返回整数: .idiv(n [, base]) ⇒ BigNumber;.dividedToIntegerByv(n [, base]) ⇒ BigNumber

    x = new BigNumber(355)
    y = new BigNumber(113)
    x.dividedBy(y)                  // '3.14159292035398230088'
    x.div(5)                        // '71'
    x.div(47, 16)                   // '5'
    复制代码

    取模/取余: .mod(n [, base]) ⇒ BigNumber;modulo.(n [, base]) ⇒ BigNumber

    1 % 0.9                         // 0.09999999999999998
    x = new BigNumber(1)
    x.modulo(0.9)                   // '0.1'
    y = new BigNumber(33)
    y.mod('a', 33)                  // '3'
    复制代码

    注意: 取模/取余运算受MODULO_MODE设置影响

    指数运算: .pow(n [, m]) ⇒ BigNumber;.exponentiatedBy(n [, m]) ⇒ BigNumber

    Math.pow(0.7, 2)                // 0.48999999999999994
    x = new BigNumber(0.7)
    x.exponentiatedBy(2)            // '0.49'
    BigNumber(3).pow(-2)            // '0.11111111111111111111'
    复制代码

    注意: n代表的是指数。如果n<0,计算结果肯定是小数,所以计算结果会受 DECIMAL_PLACES 和 ROUNDING_MODE影响。

    开平方:.sqrt() ⇒ BigNumber;.squareRoot.() ⇒ BigNumber

    x = new BigNumber(16)
    x.squareRoot()                  // '4'
    y = new BigNumber(3)
    y.sqrt()                        // '1.73205080756887729353'
    复制代码

    比较大小: .comparedTo(n [, base]) ⇒ number

    比较结果,参考如下表:

    1	操作数>n
    -1	操作数<n
    0	操作数==n
    null	操作数或者n不是数字
    复制代码

    举例:

    x = new BigNumber(Infinity)
    y = new BigNumber(5)
    x.comparedTo(y)                 // 1
    x.comparedTo(x.minus(1))        // 0
    y.comparedTo(NaN)               // null
    y.comparedTo('110', 2)          // -1
    复制代码

    精度调整

    .dp([dp [, rm]]) ⇒ BigNumber|number;decimalPlaces.[dp [, rm]]) ⇒ BigNumber|number 根据dp(decimals places)和rm(round mode)对操作数进行舍入

    x = new BigNumber(1234.56)
    x.decimalPlaces(1)                     // '1234.6'
    x.dp()                                 // 2  如果不传dp,则函数返回的是操作数的小数点的位数
    x.decimalPlaces(2)                     // '1234.56'
    x.dp(10)                               // '1234.56'
    x.decimalPlaces(0, 1)                  // '1234'
    x.dp(0, 6)                             // '1235'
    x.decimalPlaces(1, 1)                  // '1234.5'
    x.dp(1, BigNumber.ROUND_HALF_EVEN)     // '1234.6'
    x                                      // '1234.56'
    复制代码

    取整:.integerValue([rm]) ⇒ BigNumber

    根据rm(round mode)返回操作数的整数部分

    x = new BigNumber(123.456)
    x.integerValue()                        // '123'
    x.integerValue(BigNumber.ROUND_CEIL)    // '124'
    y = new BigNumber(-12.7)
    y.integerValue()                        // '-13'
    y.integerValue(BigNumber.ROUND_DOWN)    // '-12',向0舍入
    复制代码

    有效数字 .sd([d [, rm]]) ⇒ BigNumber|number;precision.([d [, rm]]) ⇒ BigNumber|number

    什么是有效数字?--->从该数的第一个非零数字起,直到末尾数字止的数字称为有效数字,如0.618的有效数字有三个,分别是6,1,8。

    x = new BigNumber(9876.54321)
    x.precision(6)                         // '9876.54'
    x.sd()                                 // 9 如果省略参数d,则返回有效数字个数
    x.precision(6, BigNumber.ROUND_UP)     // '9876.55'
    x.sd(2)                                // '9900' //todo
    x.precision(2, 1)                      // '9800'    //todo
    y = new BigNumber(987000)
    y.precision()                          // 3
    y.sd(true)                             // 6,如多参数sd为true,则整数部分后边的0也会被认为是有效数字
    复制代码

    .toFixed([dp [, rm]]) ⇒ string

    返回一个字符串,小数位根据dp截取或者填充。
    注意: Unlike Number.prototype.toFixed, which returns exponential notation if a number is greater or equal to 1021, this method will always return normal notation.

    跟Number.prototype.toFixed(dp)的异同

    1. 如果省略参数dp,BigNumber(1.123).toFixed() 原样返回'1.123';而1.123.toFixed()会去掉所有小数位,只返回整数位'1'
    2. 如果操作数大于10^21,BigNumber(10^21).toFixed()会跟普通数字一样返回;10^21.toFixed() 会通过指数形式返回
    Math.pow(10,20).toFixed()   //"100000000000000000000"
    Math.pow(10,21).toFixed()   //"1e+21"
    
    BigNumber(10).pow(20).toFixed() //"100000000000000000000"
    BigNumber(10).pow(21).toFixed() //"1000000000000000000000"
    复制代码

    示例:

    x = 3.456
    y = new BigNumber(x)
    x.toFixed()                     // '3'
    y.toFixed()                     // '3.456'
    y.toFixed(0)                    // '3'
    x.toFixed(2)                    // '3.46'
    y.toFixed(2)                    // '3.46'
    y.toFixed(2, 1)                 // '3.45'  (ROUND_DOWN)
    x.toFixed(5)                    // '3.45600'
    y.toFixed(5)                    // '3.45600'
    复制代码

    注意: toFixed()方法与dp()方法的主要区别是,toFixed返回的是字符串,如果小数位不够的话会用0补齐;dp()方法返回的是BigNumber|number,小数位不够的话会忽略

    数字格式化 .toFormat([dp [, rm]]) ⇒ string

    返回字符串,会根据dp和rm进行舍入,并根据FORMAT属性进行格式化。

    format = {
        decimalSeparator: '.',
        groupSeparator: ',',
        groupSize: 3,
        secondaryGroupSize: 0,
        fractionGroupSeparator: ' ',
        fractionGroupSize: 0
    }
    BigNumber.config({ FORMAT: format })
    
    x = new BigNumber('123456789.123456789')
    x.toFormat()                    // '123,456,789.123456789'
    x.toFormat(1)                   // '123,456,789.1'
    复制代码

    转换为js 基础数值类型 .toNumber() ⇒ number

    效果与使用+运算符一致

    x = new BigNumber(456.789)
    x.toNumber()                    // 456.789
    +x                              // 456.789
    
    复制代码

    转载于:https://juejin.im/post/5be00d15e51d451bc70bfa26

    展开全文
  • 解决js计算精度问题BigNumber.js

    千次阅读 2021-03-18 09:37:21
    因为JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。...

    欢迎点击: 个人官网博客

    JavaScript存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,像一些加减乘除的前端计算。

    为什么JavaScript会有精度问题?

    因为JavaScript中所有的数字(包括整数和小数)都只有一种类型–Number。它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。它的优点是可以归一化处理整数和小数,节省储存空间。而实际计算的时候会转换成二进制计算再转成十进制。进制转换之后会很长,舍去一部分,计算再转回来,就有了精度误差。

    不多哔哔,直接教你们怎么用bigNumber.js进行加减乘除,取余,取整取小数点等操作…

    1.引入bignumber,js

    <script src="https://cdn.bootcdn.net/ajax/libs/bignumber.js/9.0.1/bignumber.js"></script>
    

    2.嗯哼,开始了

    打印结果图(可对照下面源码观看):
    在这里插入图片描述

           // 转为 bignumber
            const xx = new BigNumber('456465455.456465464654');
            // 转为 普通数字
            // xx.toNumber()
            // 转为 字符串
            // xx.toString()
    
            // 格式化(小数点)
            console.log(xx.toFormat()) // '456,465,455.456465464654'
            // console.log(xx.toFormat(3)) // '456,465,455.456'
    
    
    
            // 加法
            console.log('----------------加法')
            console.log('正常0.1 + 0.2=',0.1 + 0.2) // 0.30000000000000004
            let x = new BigNumber(0.1)
            let y = x.plus(0.2).toNumber() // 0.3
            console.log(BigNumber(0.7).plus(x).plus(y).toNumber()) // 1.1
            console.log(x.plus('0.1').toNumber()) // 0.2
    
    
            // 减法
            console.log('----------------减法')
            console.log('正常0.3 - 0.1=',0.3 - 0.1) // 0.19999999999999998
            let x2 = new BigNumber(0.3)
            console.log(x2.minus(0.1).toNumber()) // 0.2
    
            // 乘法
            console.log('----------------乘法')
            console.log('正常0.6 * 3=',0.6 * 3) // 1.7999999999999998
            let x3 = new BigNumber(0.6)
            console.log(x3.multipliedBy(3).toNumber()) // 1.8
    
            // 除法
            console.log('----------------除法')
            let x4 = new BigNumber(335)
            console.log(x4.div(6).toNumber()) // 55.833333333333336
            console.log(x4.div(6).dp(3).toNumber()) //55.833  ---确定小数位数,取三位小数
            console.log(x4.idiv(6).toNumber()) //55  ---返回整数
    
            // 这里插入一下dp取小数点位数及取整的用法
            console.log('----------------dp的用法')
            //取几位小数进行舍入
            let x_dp = new BigNumber(1234.56)
    		 console.log(x_dp.dp())                       // 2  如果不传dp,则函数返回的是操作数的小数点的位数
    		 console.log(x_dp.dp(10).toNumber())                     // 1234.56
    		 console.log(x_dp.dp(1).toNumber())                     // 1234.6
             console.log(x_dp.toFixed(5))                   // '1234.56000'
             //取整
             console.log(x_dp.dp(0).toNumber())   //1235四舍五入
             console.log(x_dp.integerValue().toNumber())  //1235四舍五入
             console.log(x_dp.toFixed(0))                   // '1235'四舍五入
             console.log(x_dp.integerValue(BigNumber.ROUND_CEIL).toNumber()) //1235向上取整,有点Math.ceil的意思
             console.log(x_dp.integerValue(BigNumber.ROUND_DOWN).toNumber()) //1235向下取整,(如果数字直接截断可以用这个)
          
    
    
            //-----------------------取余
            console.log('----------------取余')
            console.log('正常1 % 0.9=',1 % 0.9) // 0.09999999999999998
            let x5 = new BigNumber(1)
            console.log(x5.modulo(0.9).toNumber())
    
            // 比较大小
            console.log('----------------比较大小')
            console.log(x5.eq(1)) //是否相等
            console.log(x5.gt(-1)) //是否大于
            console.log(x5.gte(1)) //是否大于等于
            console.log(x5.lt(1)) //是否小于
            console.log(x5.lte(1)) //是否小于等于
            // 取非,改变数字的正负号
            console.log('----------------取非,改变数字的正负号')
            console.log(x5.negated().toNumber())
    
            //求最大值,最小值
            console.log('----------------求最大值')
            var x6 = [2222, 3333, '4444']
            console.log(BigNumber.max(...x6).toNumber()) // 4444
            console.log(BigNumber.min(...x6).toNumber()) // 2222
    
            //求和
            console.log('----------------求和')
            var x7 = BigNumber.sum('11', 23)
            console.log(x7.toNumber()) // 34
            // 多个参数求和
            let arr7 = [2, new BigNumber(14), '15.9999', 12]
            var y7 = BigNumber.sum(...arr7)
            console.log(y7.toString()) // '43.9999'
    
            //生成伪随机数,传入参数决定小数位数
            console.log(BigNumber.random().toNumber()) // 0.1501651215311695
            console.log(BigNumber.random(3).toNumber()) // 0.150
    

    最后喜欢就点点关注吧!!!(demo源码)

    展开全文
  • es 集群 number_of_shards、number_of_replicas

    千次阅读 2020-05-19 13:58:59
    number_of_shards 是指索引要做多少个分片,只能在创建索引时指定,后期无法修改。 number_of_replicas 是指每个分片有多少个副本,后期可以动态修改 primary shard:主分片,每个文档都存储在一个分片中,当你存储...
  • 微信小程序--js中string转换为number

    千次阅读 2020-05-17 09:51:18
    在小程序编写js代码时,经常会遇到类型转换,比如string类型的"3"转换为number类型的3,那么怎么转换呢?先了解 parseInt!!! parseInt 1.定义 parseInt(string, radix) 2.参数 string 必需,要被解析的字符串...
  • MySQL使用row_number()及row_number over(partition by column) 在oracle中在处理某些数据的时候使用row_number() over(partition by a order by b desc)函数是相当方便的。遗憾的这么顺手的工具在MySQL中确没有。...
  • Python Uncompyle6 反编译工具使用 与 Magic Number 详解   最近在i春秋刷MISC题的时候,做到了好几道有pyc文件需要反编译的题,也了解到了一个非常神的Python反编译工具——Python Uncompyle6。虽然只用到了其中...
  • 成功解决ValueError: Number of passed names did not match number of header fields in the file 目录 解决问题 解决思路 解决方法 解决问题 ValueError: Number of passed names did not ...
  • Number.EPSILON

    千次阅读 2018-01-20 22:15:17
    Number.EPSILON ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。 对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,...
  • 聊一聊AS Number

    千次阅读 2018-03-31 09:06:26
    通常IP数据库的信息包括IP的经纬度信息,位置信息,以及AS Number,本次就讨论一下这个AS Number的作用。
  • 需求:这时就需要吊起移动端数字键盘,input的type就必须设置成number,当然tel类型也可以,但是无法输入小数点。当然如果精力允许,你也可以自定义数字键盘是最好的,网上也有很多Vue数字键盘组件。 踩坑:一但用...
  • JS中使用bignumber处理高精度小数运算

    千次阅读 2021-01-22 13:57:49
    项目开发中发现精度丢失的问题,如0.1+0.2 = 0.30000000000000004的问题 解决方式:引用bignumber.js用于数字... 或 npm install bignumber.js --save 命令安装后使用import BigNumber from 'bignumber.js' 引用 ...
  • Element el-input-number 计数器详解

    千次阅读 热门讨论 2021-02-02 11:46:39
    1. 用途 计数器是一种特殊的...el-input-number v-model="num1" label="请输入数量"></el-input-number> <el-divider></el-divider> 效果: 3. 指定最大、最小值 可以为计数器指定数值的最
  • 1、string 转 number 类型:有两种方法(1)parseInt()、parseFloat() (2)Number() 区别:parseInt()、parseFloat() 转换第一个无效字符之前的字符串,例如parseInt(1.2.3)为1,parseFloat(1.2.3)为1.2; Number...
  • mysql实现ROW_NUMBER()

    万次阅读 2019-09-22 03:05:28
    #mysql实现ROW_NUMBER() SELECT b.*, @rownum := @rownum + 1 AS rank FROM book b, (SELECT @rownum := 0) myTempTable; #mysql实现ROW_NUMBER() SELECT b.*, @rownum := @rownum + 1 AS rank...
  • Oracle number 类型转换为 varchar2

    千次阅读 2020-08-10 17:17:41
    本文主要记录在 oracle 中 number 类型转换为 varchar2 数据类型方法以及案例演示。 number类型的数据直接存人 varchar2 类型的字段中,会出现格式问题,如:.5, 5. 等 to_char(number) 可将 number 类型转换为 ...
  • BigNumber.js

    千次阅读 2019-07-30 16:04:42
    而JavaScript因为存在计算的精度问题,所以直接计算就可能会导致各种各样的bug,为了解决这个问题,就要使用BigNumber.js这个库。 BigNumber.js是一个用于任意精度计算的js库。可以在 官方文档 的console中测试使用...
  • 今天上扩展课的时看到的一到“超...输出结果是两个true,右侧的“number”在双等号和三等号的情况下分别代表什么类型啊(大胆猜想将NaN修改为“number”或number之后直接报错)刚开始学,实在是搞不明白了,求大神解答
  • Number类型

    千次阅读 2018-08-27 12:32:42
    Number类型 一、相关概念 1.定义 Number是与数字值对应的应用类型 创建Number对象,可以在调用Number构造函数时向其中传递相应的数值 Number类型也重写了valueOf()、toLocaleString()和...
  • lua tonumber

    千次阅读 2019-04-10 22:25:00
    【1】应用tonumber函数 1 local function test(telnum) 2 local isLen = string.len(telnum) > 0 and string.len(telnum) < 7 and string.len(telnum) ~= 4 3 local value = tonumber(string.sub(t.....
  • bignumber.js API

    万次阅读 2020-01-15 10:06:50
    import BigNumber from 'bignumber.js' 文档 加法 plus 语法 .plus(n [, base]) 参数值 n (必需): number|string|BigNumber 参与计算的数字 base: number 进制 (默认为十进制) 返回值 BigNum...
  • v-model中.number

    千次阅读 2021-05-17 09:25:35
    vue官方文档中对于v-model中.number的描述: .number 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符: <input v-model.number="age" type="number"> 这通常很有用,因为即使在 ...
  • 整理两个row_number() over()的例子

    千次阅读 2018-12-03 13:31:02
    hive> select id,userid,course,score,term from (select * ,row_number() over(partition by course,term order by score desc) rn from course_score) t where rn=1 ; Query ID = hdfs_20181203130909_5c6b4f33-02...
  • number   format   for   port   number   at   oracle .jdbc .driver .DatabaseError .throwSqlException ( DatabaseError .java :112)   at   oracle .jdbc .driver .DatabaseError .throwSqlException ( ...
  • antd+react inputnumber 小数精度

    万次阅读 2021-01-25 13:31:24
    1、首先需要inputnumber对精度进行控制,这里精度控制在1-5 <Form.Item labelCol={{ span: 8 }} wrapperCol={{ span: 8 }} label={"流速小数位数"}> {form.getFieldDecorator('flowrateDecimallen', { ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,076,870
精华内容 1,230,748
关键字:

number