折扣价和折扣实时转换

news2024/11/17 9:34:17

背景 : react 项目
问题 : 在折扣数中输入折扣2.333333,中间会多很多0,输入2.222,不能正常输入到第三位

如下图


原因 : oFixed()数字转字符串时可能会导致精度问题 
解决思路 : parseFloat来解析浮点数
原代码

  const calculateDiscountVal = (price, vip_price) => {
    if (Number(price) > 0 && Number(vip_price) > 0) {
      return (Number(vip_price) / Number(price)).toFixed(2) * 10;
    } else {
      return 0;
    }
  };

  const updateVipPriceFromDiscountRate = (price, discountRate) => {
    if (Number(price) > 0 && Number(discountRate) >= 0 && Number(discountRate) <= 10) {
      const vip_price = price * (discountRate / 10).toFixed(2);
      form.setFieldsValue({ vip_price: vip_price });
    }
  };

  useEffect(() => {
    // 只在零售价改变时更新折扣率
    let price = form.getFieldValue('price');
    let vip_price = form.getFieldValue('vip_price');
    setDiscountVal(calculateDiscountVal(price, vip_price));
  }, [form.getFieldValue('price'), form.getFieldValue('vip_price')]);

  // 问题:输入3.3折后,输入框变成3.30000 ; 原因:toFixed()数字转字符串时可能会导致精度问题 ; 解决:parseFloat来解析浮点数
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      setDiscountVal(newVal);
      const price = form.getFieldValue('price');
      updateVipPriceFromDiscountRate(price, newVal);
    }
  };



  return (
   <Form >
     <Form.Item label='零售价(元):' name='price'>
              <Input
                value={price}
                onChange={(e) => setprice(e.target.value)}
                autoComplete='off'
                allowClear
                style={{ width: 80 }}
              ></Input>
            </Form.Item>
            <Form.Item label='折扣价(元):'>
              <Form.Item name='vip_price' style={{ display: 'inline-block' }}>
                <Input
                  value={vip_price}
                  onChange={(e) => setvip_price(e.target.value)}
                  autoComplete='off'
                  allowClear
                  style={{ width: 80 }}
                ></Input>
              </Form.Item>
              <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
              </Form.Item>
            </Form.Item>
          </>
        )}

        <Form.Item wrapperCol={{ offset: 2 }}>
          <Space className='footer' size={20}>
            <Button
              onClick={() => {
                navigate(-1);
              }}
            >
              取消
            </Button>
            <Button type='primary' htmlType='submit'>
              确认
            </Button>
          </Space>
        </Form.Item>
  <<Form />

解决方法 1 :  上述其他代码不变 , 只在handleDiscountRateChange中加入parseFloat , 不可行 , 还会出现NaN , 如图

   // 在onChange中用parseFloat来解析浮点数,输入折扣数后,就触发折扣价改变,发现还是不太行,因为浮点数的精度问题可能会导致在 onChange 事件中出现意外行为。目前会更报错出现NaN,当在用户输入小数点和小数部分时,浮点数可能会被不完整地解析,导致计算错误,出现NaN
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      const roundedVal = parseFloat(newVal).toFixed(2); // 对输入的值进行四舍五入处理
      setDiscountVal(roundedVal);

      const price = form.getFieldValue('price');

      // 添加计算并更新折扣金额的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };

最终解决方案 : 将parseFloat放在失去焦点(onBlur)中处理,更靠谱 , 如图

 

  // 将parseFloat放在失去焦点(onBlur)中处理,更靠谱
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      // 不在这里进行四舍五入处理,而是在失去焦点时处理
      setDiscountVal(newVal);
    }
  };

  const handleDiscountRateBlur = () => {
    const newVal = parseFloat(discountVal);
    if (Number.isFinite(newVal) && newVal >= 0 && newVal <= 10) {
      const roundedVal = newVal.toFixed(2);
      setDiscountVal(roundedVal);
      const price = form.getFieldValue('price');

      // 添加计算并更新折扣元的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };


  <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  onBlur={handleDiscountRateBlur} // 添加失去焦点事件处理函数
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
   </Form.Item>

----------------------上述原代码不完整,以提供思路解决完问题为主,以下是完整的代码---------------------

import React, { useEffect, useState, useRef } from 'react';
import {
  Form,
  Input,
  Select,
  Button,
  Radio,
  Space,
  Image,
  Spin,
  Tree,
  Drawer,
  Row,
  Col,
} from 'antd';
import { getInfoById, publisherList, publisherAdd, getListAll, editBook } from './request';
import { getList } from '../classify/request';
import { useLocation } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { convertToAntdTreeData } from '@/utils/common.js';
const SaleEdit = () => {
  const {
    state: { id },
  } = useLocation();
  const [initialValues, setinitialValues] = useState({
    name: '',
    authors: '',
    category_id: null,
    producers_id: null,
    press_id: null,
    is_free: null,
  });
  const [form] = Form.useForm();
  const navigate = useNavigate();
  const [showAddCategory, setShowAddCategory] = useState(false); //弹出添加出品方
  const [showAddCategory1, setShowAddCategory1] = useState(false);
  const [showDrawer, setShowDrawer] = useState(false);
  const [publisher_name, setPublisherName] = useState(''); //出品方
  const [publishers, setPublishers] = useState([]);
  const [publisher_name1, setPublisherName1] = useState(''); //出版社
  const [publishers1, setPublishers1] = useState([]);
  const [treeData, setTreeData] = useState([]);

  // 在组件中添加一个状态来保存书籍类型的值
  const [bookType, setBookType] = useState(0); // 默认值为免费
  const [producersConfig, setproducersConfig] = useState({
    validateStatus: '',
    help: '',
    noStyle: false,
    style: {},
  });
  const [pressConfig, setpressConfig] = useState({
    validateStatus: '',
    help: '',
    noStyle: false,
    style: {},
  });
  const addproducers = async (obj, callbackFn) => {
    const { types } = obj;
    let flag = true;
    if (types == 1) {
      if (!publisher_name) {
        flag = false;
        setproducersConfig({
          ...producersConfig,
          validateStatus: 'error',
          help: '请输入新的出品方',
          noStyle: false,
        });
      }
    } else if (types == 2) {
      if (!publisher_name1) {
        flag = false;
        setpressConfig({
          ...pressConfig,
          validateStatus: 'error',
          help: '请输入新的出版社',
          noStyle: false,
        });
      }
    }
    if (!flag) return;
    // 上面代码是校验
    const bool = await publisherAdd(obj);
    if (!bool) return;
    callbackFn();
    setproducersConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
    setpressConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
    getProducers();
  };
  const [price, setprice] = useState(0);
  const [vip_price, setvip_price] = useState(0);
  const [discountVal, setDiscountVal] = useState(0);

  const calculateDiscountVal = (price, vip_price) => {
    if (Number(price) > 0 && Number(vip_price) > 0) {
      return (Number(vip_price) / Number(price)).toFixed(2) * 10;
    } else {
      return 0;
    }
  };

  const updateVipPriceFromDiscountRate = (price, discountRate) => {
    if (Number(price) > 0 && Number(discountRate) >= 0 && Number(discountRate) <= 10) {
      const vip_price = price * (discountRate / 10).toFixed(2);
      form.setFieldsValue({ vip_price: vip_price });
    }
  };

  useEffect(() => {
    // 只在零售价改变时更新折扣率
    let price = form.getFieldValue('price');
    let vip_price = form.getFieldValue('vip_price');
    setDiscountVal(calculateDiscountVal(price, vip_price));
  }, [form.getFieldValue('price'), form.getFieldValue('vip_price')]);

  // // 问题:输入3.3折后,输入框变成3.30000 ; 原因:toFixed()数字转字符串时可能会导致精度问题 ; 解决:parseFloat来解析浮点数
  // const handleDiscountRateChange = (ev) => {
  //   const newVal = ev.target.value;
  //   if (Number(newVal) >= 0 && Number(newVal) <= 10) {
  //     setDiscountVal(newVal);
  //     const price = form.getFieldValue('price');
  //     updateVipPriceFromDiscountRate(price, newVal);
  //   }
  // };

  // 在onChange中用parseFloat来解析浮点数,输入折扣数后,就触发折扣价改变,发现还是不太行,因为浮点数的精度问题可能会导致在 onChange 事件中出现意外行为。目前会更报错出现NaN,当在用户输入小数点和小数部分时,浮点数可能会被不完整地解析,导致计算错误,出现NaN
  // const handleDiscountRateChange = (ev) => {
  //   const newVal = ev.target.value;
  //   if (Number(newVal) >= 0 && Number(newVal) <= 10) {
  //     const roundedVal = parseFloat(newVal).toFixed(2); // 对输入的值进行四舍五入处理
  //     setDiscountVal(roundedVal);

  //     const price = form.getFieldValue('price');

  //     // 添加计算并更新折扣金额的逻辑
  //     if (Number(price) > 0) {
  //       const vip_price = price * (roundedVal / 10);
  //       form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
  //     }
  //   }
  // };

  // 将parseFloat放在失去焦点(onBlur)中处理,更靠谱
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      // 不在这里进行四舍五入处理,而是在失去焦点时处理
      setDiscountVal(newVal);
    }
  };

  const handleDiscountRateBlur = () => {
    const newVal = parseFloat(discountVal);
    if (Number.isFinite(newVal) && newVal >= 0 && newVal <= 10) {
      const roundedVal = newVal.toFixed(2);
      setDiscountVal(roundedVal);
      const price = form.getFieldValue('price');

      // 添加计算并更新折扣元的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };

  useEffect(() => {
    if (!showAddCategory) {
      setPublisherName('');
    }
    if (!showAddCategory1) {
      setPublisherName1('');
    }
  }, [showAddCategory, showAddCategory1]);

  const handleOpenDrawer = async () => {
    setShowDrawer(true);
    const data = await getListAll({ book_id: id });
    let arr = convertToAntdTreeData(data, 'name');
    setTreeData(arr);
  };

  const handleCloseDrawer = () => {
    setShowDrawer(false);
  };
  const [classData, setClassData] = useState([]);
  const [producersData, setproducersData] = useState([]);
  const [pressData, setpressData] = useState([]);
  // 出品方/出版社
  const getProducers = async () => {
    const producersList = await publisherList({ types: 1 });
    const press = await publisherList({ types: 2 });
    setproducersData(producersList);
    setpressData(press);
  };
  const [FormLoad, setFormLoad] = useState(true);

  const [checkedKeys, setcheckedKeys] = useState([]);

  const submitTree = (obj) => {
    form.setFieldValue('trials', checkedKeys);
    handleCloseDrawer(false);
  };

  const ontreeCheck = (keys, { checked, checkedNodes, node, halfCheckedKeys }) => {
    setcheckedKeys(keys);
  };
  const getinfo = async () => {
    setFormLoad(true);
    // 详情
    const data = await getInfoById({ id });
    const { category_id, producers_id, press_id } = data;
    let obj = { category_id, producers_id, press_id };
    setBookType(data.is_free);
    for (let key in obj) {
      if (obj[key] === 0) {
        obj[key] = null;
      }
    }
    form.setFieldsValue({ ...data, ...obj });
    setFormLoad(false);
  };
  const getInfo = async () => {
    // 分类
    const { list } = await getList({ page: 1, page_size: 999 });
    setClassData(list);
    getProducers();
    getinfo();
  };
  const onFinish = async (obj) => {
    const bool = await editBook({ ...obj, id });
    if (!bool) return;
    navigate(-1);
  };
  useEffect(() => {
    getInfo();
  }, []);

  return (
    <Spin spinning={FormLoad} style={{ padding: 20 }}>
      <Form labelCol={{ span: 2 }} form={form} initialValues={initialValues} onFinish={onFinish}>
        <Form.Item label='书籍名称' name='name'>
          <Input
            disabled
            allowClear
            autoComplete='off'
            placeholder='请输入书籍名称'
            style={{ width: 400 }}
          ></Input>
        </Form.Item>
        <Form.Item label='书籍作者' name='authors'>
          <Input autoComplete='off' disabled style={{ width: 260 }}></Input>
        </Form.Item>
        <Form.Item
          label='分类'
          name='category_id'
          rules={[{ required: true, message: '请选择分类' }]}
        >
          <Select placeholder='请选择分类' style={{ width: 260 }}>
            {classData &&
              classData.map((item) => (
                <Select.Option value={item.id} key={item.id}>
                  {item.name}
                </Select.Option>
              ))}
          </Select>
        </Form.Item>
        <Form.Item label='出品方' required style={producersConfig.style}>
          <Space>
            <Form.Item
              noStyle
              name='producers_id'
              rules={[{ required: true, message: '请选择出品方' }]}
            >
              <Select placeholder='请选择出品方' style={{ width: 260 }}>
                {producersData?.map((item) => (
                  <Select.Option key={item.id} value={item.id}>
                    {item.publisher_name}
                  </Select.Option>
                ))}
              </Select>
            </Form.Item>
            <a
              style={{
                textDecoration: 'underline',
                color: '#1672EC',
                cursor: 'pointer',
              }}
              onClick={() => {
                setproducersConfig({ ...producersConfig, style: { marginBottom: 0 } });
                setShowAddCategory(true);
              }}
            >
              添加出品方
            </a>
          </Space>
          {showAddCategory && (
            <div style={{ marginTop: '10px' }}>
              <Space>
                <Form.Item
                  noStyle={producersConfig.noStyle}
                  validateStatus={producersConfig.validateStatus}
                  help={producersConfig.help}
                >
                  <Input
                    style={{ width: 260 }}
                    autoComplete='off'
                    placeholder='请输入新的出品方'
                    value={publisher_name}
                    allowClear
                    onChange={(e) => {
                      let val = e.target.value;
                      if (val) {
                        setproducersConfig({ ...producersConfig, help: '', validateStatus: '' });
                      }
                      setPublisherName(val);
                    }}
                  />
                </Form.Item>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#1672EC' }}
                  onClick={() =>
                    addproducers({ types: 1, publisher_name }, () => setShowAddCategory(false))
                  }
                >
                  添加
                </a>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#AA1941' }}
                  onClick={() => {
                    setproducersConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
                    setShowAddCategory(false); // 可选:添加后关闭输入框
                  }}
                >
                  删除
                </a>
              </Space>
            </div>
          )}
        </Form.Item>
        <Form.Item label='出版社' required style={pressConfig.style}>
          <Space>
            <Form.Item
              noStyle
              name='press_id'
              rules={[{ required: true, message: '请选择出版社' }]}
            >
              <Select placeholder='请选择出品方' style={{ width: 260 }}>
                {pressData?.map((item) => {
                  return (
                    <Select.Option key={item.id} value={item.id}>
                      {item.publisher_name}
                    </Select.Option>
                  );
                })}
              </Select>
            </Form.Item>
            <a
              style={{
                textDecoration: 'underline',
                color: '#1672EC',
                cursor: 'pointer',
              }}
              onClick={() => {
                setpressConfig({ ...pressConfig, style: { marginBottom: 0 } });
                setShowAddCategory1(true);
              }}
            >
              添加出版社
            </a>
          </Space>
          {showAddCategory1 && (
            <div style={{ marginTop: '10px' }}>
              <Space>
                <Form.Item
                  noStyle={pressConfig.noStyle}
                  validateStatus={pressConfig.validateStatus}
                  help={pressConfig.help}
                >
                  <Input
                    style={{ width: 260 }}
                    autoComplete='off'
                    placeholder='请输入新的出版社'
                    allowClear
                    value={publisher_name1}
                    onChange={(e) => {
                      let val = e.target.value;
                      if (val) {
                        setpressConfig({ ...pressConfig, help: '', validateStatus: '' });
                      }
                      setPublisherName1(e.target.value);
                    }}
                  />
                </Form.Item>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#1672EC' }}
                  onClick={() =>
                    addproducers({ types: 2, publisher_name: publisher_name1 }, () =>
                      setShowAddCategory1(false),
                    )
                  }
                >
                  添加
                </a>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#AA1941' }}
                  onClick={() => {
                    setpressConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
                    setShowAddCategory1(false);
                  }}
                >
                  删除
                </a>
              </Space>
            </div>
          )}
        </Form.Item>
        <Form.Item label='书籍类型' name='is_free'>
          <Radio.Group
            onChange={(e) => {
              setBookType(e.target.value);
            }}
          >
            <Radio value={1}>免费</Radio>
            <Radio value={0}>付费</Radio>
          </Radio.Group>
        </Form.Item>
        {bookType === 0 && (
          <Form.Item label='试读章节' name='trials'>
            <a type='link' style={{ textDecoration: 'underline' }} onClick={handleOpenDrawer}>
              选择试读章节
            </a>
          </Form.Item>
        )}

        {bookType === 0 && (
          <>
            <Form.Item label='零售价(元):' name='price'>
              <Input
                value={price}
                onChange={(e) => setprice(e.target.value)}
                autoComplete='off'
                allowClear
                style={{ width: 80 }}
              ></Input>
            </Form.Item>
            <Form.Item label='折扣价(元):'>
              <Form.Item name='vip_price' style={{ display: 'inline-block' }}>
                <Input
                  value={vip_price}
                  onChange={(e) => setvip_price(e.target.value)}
                  autoComplete='off'
                  allowClear
                  style={{ width: 80 }}
                ></Input>
              </Form.Item>
              <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  onBlur={handleDiscountRateBlur} // 添加失去焦点事件处理函数
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
              </Form.Item>
            </Form.Item>
          </>
        )}
        <Form.Item wrapperCol={{ offset: 2 }}>
          <Space className='footer' size={20}>
            <Button
              onClick={() => {
                navigate(-1);
              }}
            >
              取消
            </Button>
            <Button type='primary' htmlType='submit'>
              确认
            </Button>
          </Space>
        </Form.Item>
      </Form>

      <Drawer
        placement='right'
        onClose={handleCloseDrawer}
        open={showDrawer}
        labelCol={{ span: 7 }}
        mask={false}
      >
        <Form onFinish={submitTree}>
          <Form.Item name='power_list' style={{ padding: 10 }}>
            <Tree
              checkable
              checkedKeys={checkedKeys}
              defaultExpandAll={false} //让授权后的弹窗只展示根标签
              treeData={treeData}
              // showLine //删除这里,树形结构左侧的下拉线消失,图标从+-更改为默认的△
              // checkStrictly
              onCheck={ontreeCheck}
            />
          </Form.Item>
          <Form.Item wrapperCol={{ offset: 10, span: 16 }}>
            <Space size={20}>
              <Button className='cancel' onClick={() => handleCloseDrawer(false)}>
                取消
              </Button>
              <Button className='submit' htmlType='submit'>
                提交
              </Button>
            </Space>
          </Form.Item>
        </Form>
      </Drawer>
    </Spin>
  );
};

export default SaleEdit;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习Java的第四天

目录 一、if选择结构 1、基本if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 2、if-else 选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 3、多重if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a…

如何让JMeter也生成精美详细allure测试报告

&#xff08;全文约2000字&#xff0c;阅读约需5分钟&#xff0c;首发于公众号&#xff1a;测试开发研习社&#xff0c;欢迎关注&#xff09; 内容目录&#xff1a; 一、需求 二、思路 三、验证 四、实现 五、优化 六、彩蛋 篇幅较长&#xff0c;建议先收藏后阅读 一、需…

Java项目:42 ssm的高校专业信息管理系统设计与实现001

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务 管理员查看学生报名专业&#xff0c;管理专业&#xff0c;课程以及学生&#xff0c;查看学生提问并回答问题&#x…

飞驰云联CEO朱旭光荣获“科技领军人才”称号

2024年2月29日&#xff0c;苏州工业园区“优化营商环境暨作风效能建设大会”成功举办&#xff0c;会上公布了2023年度苏州工业园区第十七届第一批金鸡湖科技领军人才名单&#xff0c;Ftrans飞驰云联创始人兼CEO朱旭光先生凭借在数据安全以及文件交换领域取得的突出成果&#xf…

浅谈高并发的一些解决思路

前言 《中国互联网发展状况统计报告》指出&#xff0c;截至2020年6月&#xff0c;我国网民规模已经达到9.40亿&#xff0c;较2020年3月年增长3625万&#xff0c;除了如此庞大的用户基数&#xff0c;如今人们接入互联网的方式也越来越多样&#xff0c;小到智能手表&#xff0c;…

MySQL存储函数

存储函数是有返回值存储过程&#xff0c;存储函数的参数只能还是IN类型的 1、语法 create function 存储函数名称 &#xff08;[参数列表]&#xff09;Returns type [characterrastic...]Begin--SQL语句Return ..;End;characterrastic说明&#xff1a;Deterministic:相同的输…

纯css实现太极八卦图

感觉最近好像闯鬼了&#xff0c;赶紧写个八卦图避避邪&#xff0c;开玩笑了&#xff0c;不废话&#xff0c;上菜&#xff0c;看效果上代码。 效果 代码&#xff0c;你们都是大佬&#xff0c;这里就不解释代码了 &#xff08;hover会转动喔&#xff09;。 <!DOCTYPE html&g…

Linux:kubernetes(k8s)探针LivenessProbe的使用(9)

他做的事情就是当我检测的一个东西他不在规定的时间内存在的话&#xff0c;我就让他重启&#xff0c;这个检测的目标可以是文件或者端口等 我这个是在上一章的基础之上继续操作&#xff0c;我会保留startupProbe探针让后看一下他俩的执行优先的一个效果 Linux&#xff1a;kuber…

图机器学习(3)-连接层面的特征工程

0 问题定义 通过已经连接去猜未知连接&#xff1a; 有两个思路&#xff1a;

金融行业专题|基金超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在基金行业的覆盖范围、部署规模与应用场景。更新信创云资源池、关键业务系统性能优化等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎下载阅读电子书《金融核心生产业务场景探索文章合集》。 随着数字化经济的蓬勃发展&#xf…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

板绘学习路线、技巧和日常练习-----线条基础(点线面)---持续补充

板绘学习路线、技巧和日常练习-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/136199248 虽然PS画线条可以用快捷键画&#xff0c;但是太AI了。我们需要线条包含更多的人性。所以通过我们心-脑-手&#xff0c;这样…

腾讯云2024年云服务器优惠价格表,不买后悔!

腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

滤波器:工作原理和分类及应用领域?|深圳比创达电子EMC

滤波器在电子领域中扮演着重要的角色&#xff0c;用于处理信号、抑制噪声以及滤除干扰。本文将详细介绍滤波器的工作原理、分类以及在各个应用领域中的具体应用。 一、滤波器的定义和作用 滤波器是一种电子设备&#xff0c;用于选择性地通过或阻塞特定频率范围内的信号。其主…

【小黑送书—第十一期】>>如何阅读“计算机界三大神书”之一 ——SICP(文末送书)

《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算机科学技术教育的发展和成熟产生了很大影响。…

MySQL的事务隔离级别介绍

我将为您详细讲解 MySQL 的事务隔离级别&#xff0c;并给出相应的简单例子。事务隔离级别是数据库管理系统中用于控制事务内外的数据一致性和并发性的重要概念。在 MySQL 中&#xff0c;事务隔离级别用于解决并发操作可能产生的问题&#xff0c;如脏读、不可重复读和幻读。 1. …

自然语言处理: 第十三章P-tuing系列之P-tuning V1

项目地址: P-Tuning 论文地址: [2103.10385] GPT Understands, Too (arxiv.org) 理论基础 正如果上一节介绍LoRA(自然语言处理: 第十二章LoRA解读_lora自然英语处理-CSDN博客)一样,本次介绍的在21年由清华团推提出来的 P-Tuning V1系列也属于PEFT(参数高效微调系列)里的一种&…

人类与智能体

1、人类与智能体 人类与智能体之间的关系在当今科技发展中变得日益紧密。智能体&#xff0c;作为人工智能领域的一个核心概念&#xff0c;通常指的是一种能够感知环境、做出决策并采取行动以实现特定目标的实体&#xff0c;它可以是软件系统、机器人或其他类型的自动化装置。 …

Java代码审计安全篇-目录穿越漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

离散数学——(3)联结词及对应的真值指派,最小全功能联结词集,对偶式,范式,范式存在定理,小项

目录 1.联结词及对应的真值指派 2.最小全功能联结词集 3.对偶式 4.范式 1.析取范式 5.范式存在定理 6.小项 1.联结词及对应的真值指派 2.最小全功能联结词集 3.对偶式 4.范式 1.析取范式 5.范式存在定理 6.小项